一、Golang简介

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种计算机高级编程语言。

Go的官方文档:https://golang.org

Go中文社区网站: https://studygolang.com/

1、Go的诞生

在go退推出之前,已经存在很多高级编程语言了,比如:C、C++、C#、Java…。为什么还要再造一个GO呢?

主要原因有三个:

1> 计算机硬件技术更新频繁,性能提高很快。但是主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。 旧的编程语言无法在开发效率与执行效率之间做出很好的平衡:

  • C++之类,执行效率高,开发效率低、编译速度慢。
  • JAVA之类,拥有高效的编译速度,但是执行效率低。

整体来看各个语言的执行效率和开发效率:

  • 执行效率(execution speed): C/C++ > Java > Python
  • 开发效率(developing efficiency): Python > Java > C/C++

Go语言的诞生一方面便是为了同时拥有高效的执行速度、编译速度和开发速度。

2> 软件系统复杂度越来越高,维护成本越来越高,缺乏一个足够简洁高效的编程语言。

  • 在Google公司内部,随着项目规模的不断扩大,开发和维护的复杂性也正在把Google公司一步一步拖入泥潭中。
  • 系统越来越复杂,大量的代码是由C++、Java、Python 写成,规模越来越庞大。需要大量的程序员每天都在围绕着数以万计行的代码、数百万的服务器工作着,以保证各项服务的正常运行。

3> 企业运行维护很多c/c++的项目,c/c++程序运行速度虽然很快,但是编译速度确很慢,同时还存在内存泄漏的一系列的困扰需要解决。

针对上述问题,谷歌公司的三位工程师于 2007 年 9 月 20 号下午进行一次讨论,正是这次讨论才有了第二天组织在位于加利福尼亚的山景城 43 号楼的三人会议。这与会的三人正是Go 的创始人:Robert Griesemer,Rob Pike 和 Ken Thompson。这三个神仙主要成就如下:

  1. Robert Griesemer罗伯特.格利茨默(Java HotSpot虚拟机、V8引擎开发者之一)
  2. Rob Pike罗伯.派克(贝尔实验室UNIX团队成员,曾参与Plan9、Inferno和Limbo等项目)
  3. Ken Thompson肯.汤普森(贝尔实验室UNIX团队成员,C语言、UNIX和Plan 9创始人之一,与Rob Pike共同开发了UTF-8字符集规范)

在Go的官网(https://go.dev/solutions/google/)上有Rob Pike的一段话,讲述了Go的诞生、发版、现状(2020年):

在这里插入图片描述

2、Go的官网域名

为什么官方叫Golang,而大家都在说它是Go呢?

go.orggolang.org

3、Go的发展

Go 语言起源于2007 年9月,2009年11月Google公司正式发布Go语言,并以BSD协议完全开源,2012年3月 go1.0发布,2015年8月go1.5版本发布(历史性的节点,完全移除C语言部分,使用GO编译GO)。当前最新的版本为go1.20。所有的发版节点(传送链接)如下:
在这里插入图片描述

此外,在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上;并且官方承诺,新版本对老版本下开发的代码完全兼容。

近2-3年GO语言在语言排行榜(https://www.tiobe.com/tiobe-index/)上的名次比较固定(第12位左右):
在这里插入图片描述

整体语言使用率趋势如下:

在这里插入图片描述

4、Go的设计思想

GO的核心设计很简单就是为了简单:“keep it simple”,其追求简单实用的哲学,从语言的层面上减少代码的复杂度。

比如:隐式接口&切片、类的弱化、指针的弱化、简洁高效的开发。

5、Go的特点

GO相对其他语法来说,最大的特点:并发。

其原生支持并发编程。Go 语言的对网络通信、并发和并行编程的支持度极高,从而可以更好地利用大量的分布式和多核的计算机。

开发者可以通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。

后续扩展GO的编程模型(GMP)。

不过GO也有很多面向对象语言的特性没有给以支持:

  • 不支持函数重载和操作符重载,为了简化设计;
  • 不支持隐式转换,为了避免在 C/C++ 开发中的一些 Bug 和混乱;
  • 放弃类和类型的继承,通过其他方式实现面向对象设计;
  • 不支持泛型;
  • 不支持动态加载代码、动态链接库;
  • 不支持动态代理;
  • 不支持静态变量;
  • 不支持断言;
  • 通过 recover 和 panic 来替代异常机制。

6、Go的性能

同C、C++一样,Go语言也是编译型的语言,它直接将人类可读的代码编译成了处理器可以直接运行的二进制文件,执行效率更高,性能更好。

根据 Go 开发团队和基本的算法测试,于 2013 年 3 月 28 日之前统计结果得出,Go 语言与 C 语言的性能差距大概在 10%~20% 之间。

保守估计在相同的环境和执行目标的情况下,Go 程序比 Java 或 Scala 应用程序要快上 2 倍,并比这两门语言使用少占用 70% 的内存。

7、Go的吉祥物

金花鼠(Gordon)

在这里插入图片描述

二、Go和Java的宏观对比

1> 跨平台?

  • Java因为有JVM虚拟机支撑的,故有“一次编译、处处运行”的特性。
  • 而GO没有虚拟机,不跨平台(多个操作系统),想要运行在多个平台,需要针对每个平台打不同的二进制程序包,编译成对应服务器操作系统版本的可执行程序,比如:windows的exe程序。
    • 我们说的go跨平台,指32位和64位相同操作系统之间的跨平台。

2> 代码风格?

  • Java语言编程风格很面向对象,提供了很多面向对象的特点,比如:重写、重载、继承、泛型、动态代理…
  • 而Go本着其设计原则**"keep it simple”**,更加简洁,可以用更少的代码实现同样的功能。

3> 并发性能(底层CPU的利用)?

  • GO1.5版本之前底层也和Java一样都是用C实现的。
  • JAVA诞生时(1995年),硬件层面还没有多核CPU的电脑,它对并发的支持是后来添加上去的。
  • 而GO诞生时(2009年),已经有了多核CPU的电脑,所以其在设计的时候充分利用了多核CPU,所以它对高并发的支持更好。

1、编译型语言 or 解释型语言

计算机编程语言按照运行方式可以分为:编译型语言、解释型语言。

  • 编译型:程序运行前先用编译器将程序源代码进行编译,以后拿着编译的结果直接运行。
  • 解释型:每次运行程序时,都需要拿到源代码,让解释器解释执行。

在这里插入图片描述

Go是一种编译型语言,运行在不同的平台需要打包成不同操作系统类型下的可执行文件。

Java既不是完全的编译型语言,也不是完全的解释型语言,它属于半编译、半解释型语言

  • 半编译:指它的代码都会编译成class类型的文件,并且只需要编译一次,就可以在不同的操作系统的Java虚拟机上执行;
  • 半解释:指在Java虚拟机中,它还是需要一句一句的将class文件的代码解释成对应操作系统可执行的代码。

2、微观对比

1> 引用类型参数传递

  • Go可以按值传递(以对象为参数)、也可以按引用传递(以对象指针为参数)。
  • Java只能是按引用传递

2> 面向对象特性

  • Go主打一个简单,没有切面编程、泛型、继承…
  • Java有很多面向对象的特性。

更多微观层面 Go 和 Java语言使用上的一些区别,见专栏的后续文章。

三、Go应用场景

编程语言只是一种工具,没有最好的,只有最合适的。

1、服务器编程。和Java一样,Go语言最多的应用场景就是服务器后端系统的开发,例如:微服务系统开发(Web应用、API应用)、处理日志、数据打包、虚拟机处理、文件系统等。

2、分布式系统开发。比如:集群系统、游戏服务器、数据库代理器、中间件等场景。

3、网络编程。Go非常适用需要高性能高并发的网络编程,用Socket相互传输数据的系统,类似于Java中Netty的用途。

4、云原生平台(运维管理系统)开发。目前国外很多云平台都采用Go开发,比如:Docker,K8s、以及很多DevOps平台。

5、游戏系统开发。

6、区块链开发。GO语言是区块链的第一开发语言。

Go语言不适合的场景为:

  • 强实时性软件,比如:语音通信、无人驾驶、垃圾回收、自动内存分配等。

1、开源上的应用

云原生技术中代表性的技术:docker、kubernetes、Prometheus、etcd、consul都是使用GO开发的。

笔者研究Go也正是为了看这几个技术的源码。

四、总结和后续

本文主要介绍了Golang的一些常识。

专栏将类比着Java介绍Go语言的使用,并以此展开对后续云原生开源技术的实践、源码阅读。

下一篇文章继续GO环境的搭建、Hello World代码的运行和运行原理。