# Go语言

golang

# 1 什么是Go语言?

Go语言也称 Golang,兼具效率、性能、安全、健壮等特性。Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验就可以轻松搞定 写代码更加高效;优化了多处理器系统的应用程序,使其可以媲美C或者C++代码程序的速度。另外,他更加安全的支持并行进程;

Go语言不仅提供了高性能语言,同时让开发更加迅速;

Go语言是一门编译型的系统编程语言,具有静态编译语言的高性能和动态语言的高效开发双重特点。

# 2 Go语言特性

# 2.1 自动垃圾回收

在Go语言中,系统会自动判断何时需要释放之前分配的内存空间,并在CPU相对空闲时对不使用的内存进行收集。

# 2.2 丰富的内置类型

在Go语言中,内置类型包含:整型,浮点型,数组,字符串,字典map,切片slice。因为语言的内置特性,开发者不用添加依赖的包,让代码更简洁。

# 2.3 函数多返回值

Go语言是静态开发语言中率先提供多返回值功能的语言。如果开发者只关心函数中的某几个返回值,可以直接使用下划线作为占位符忽略其他不关心的返回值。

# 2.4 异常处理

异常处理涉及3个关键字:error、panic和recover。其中error报告程序中的普通错误,panic报告程序中的致命性错误,而recover可以让程序从panic状态中恢复。

# 2.5 匿名函数与闭包

匿名函数就是没有定义函数名的一种函数。而在Go语言中,闭包就是匿名函数,它可以通过匿名函数“捕获”和它在同一作用域的其它常量和变量。

# 2.6 结构体

结构体是一系列具有相同或不同类型的数据构成的数据集合。例如,可以利用结构体定义一个学生的学号/姓名/性别/年龄等属性。

# 2.7 接口

接口是具体描述一系列方法的集合。例如,可以利用接口将一个人的说、唱这些行为集中到一起。

# 2.8 并发编程

并发编程,就是在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。如图所示。

Golang从语言级别上对并发提供了支持,goroutine是Go并发设计的核心,而goroutine就是Go语言实现的协程。在Go程序里,只需要在函数调⽤语句前添加关键字“go”,就可创建并发执行单元。

# 3 Go语言适合做什么

其实Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于需要很多程序员一起开发,并且开发周期较长的大型软件和支持云计算的网络服务。

Go语言融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性,不仅提高了项目的开发速度,而且后期维护起来也非常轻松。

鉴于Go语言的特点和设计的初衷,从以下几个方面来分析Go语言擅长的领域: 在服务器编程方面,Go语言适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等; 网络编程方面,Go语言广泛应用于 Web 应用、API 应用、下载应用等; 此外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用 Go 开发。

除了上面介绍到的,Go语言还可以用来开发底层,例如以太坊、超级账本等都是基于Go语言开发的。

而且对于现在比较流行的区块链技术方面,Go语言也是非常受欢迎的,很多基于区块链的 DApps(去中心化应用)和工具都是用的Go语言来实现的。

下面列举了一些基于Go语言开发的优秀开源项目:

  • 云计算基础设施领域,代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。
  • 基础软件,代表项目:tidb、influxdb、cockroachdb 等。
  • 微服务,代表项目:go-kit、micro、monzo bank 的 typhon、bilibili 等。
  • 互联网基础设施,代表项目:以太坊、hyperledger 等。

总之,Go语言的优势还是比较多的,比如Go语言的性能非常出色,最关键的是在性能强劲的同时还能像解释型语言一样高效地进行开发。

# 4 Go语言和其它编程语言的对比

在软件行业做过一段时间的人都知道,没有万能的编程语言,也没有万能开发框架,更没有万能的解决方案。任何新技术的产生都应该归功于一部分人对老旧技术的强烈不满。Go语言也不例外。比如,C语言的依赖管理、C++ 的垃圾回收、Java 笨重的类型系统和厚重的 Java EE 规范,以及脚本语言(如 PHP、Python 和 Ruby)的性能,这些都是很多开发者社区经常争论和抱怨的问题。 Go语言的优势 Go语言是集多编程范式之大成者,体现了优秀的软件工程思想和原则,其特性可以使开发者快速地开发、测试和部署程序,大大提高了生产效率。下面我们来看看与其他主流语言相比,Go语言具有的优势。

  1. 相对于 C/C++ 来讲,Go语言拥有清晰的依赖管理和全自动的垃圾回收机制,因此其代码量大大降低,开发效率大大提高。

  2. 相对于 Java 来讲,Go语言拥有简明的类型系统、函数式编程范式和先进的并发编程模型。因此其代码块更小更简洁、可重用性更高,并可在多核计算环境下更快地运行。

  3. 对于 PHP 来讲,Go语言更具通用性和规范性。这使得其更适合构建大型的软件,并能够更好地将各个模块组织在一起。在性能方面,PHP 不可与 Go 同日而语。

  4. 对于 Python/Ruby 来讲,Go 的优势在于其简洁的语法、非侵入式和扁平化的类型系统和浑然天成的多范式编程模型。与 PHP 一样,Python 和 Ruby 也是动态类型的解释型语言,这就意味着它们的运行速度会比静态类型的编译型语言慢很多。

总而言之,Go语言对于当前大多数主流语言来讲,最大的优势在于具有较高的生产效率、先进的依赖管理和类型系统,以及原生的并发计算支持。因此,Go语言自发布以来就受到了各个领域开发者的关注和青睐。 Go语言的劣势 下面,我们来客观地看一下目前Go语言需要加强或改进的地方(虽然有些 Gopher 并不这么认为)。

  1. 从分布式计算的角度来看,Go语言的成熟度不及 Erlang(现在已经出现了一些这方面的Go语言代码包,我们已经可以看到光明的未来了)。

  2. 从程序运行速度的角度来看,Go语言虽然已与 Java 不相上下,但还不及 C(差距正在不断地缩小)。

  3. 从第三方库的角度来看,Go语言的库数量还远远不及其他几门主流语言(比如 Java、Python、Ruby 等)。不过与Go语言的年纪相比,用它实现的第三方库已经相当多了,并且它们的数量在持续地飞速增长中。

另外,在更深的层面,Go语言标准库中也有些不尽如人意的的地方。具体如下。

  1. 从语言语法角度来看,Go语言语法里的语法糖并不多,这让许多 Python、Ruby 爱好者们对它不屑一顾。另外,变量赋值方式多得有点儿累赘了。最让人遗憾的也是我比较在意的一个地方是,Go语言不支持自定义的泛型类型。

  2. 从并发编程角度来看,Go语言提供的并发模型很强大,但也有一些编写规则需要了解。否则,很容易踩进“坑”里。其实不提倡把这叫作“坑”。因为这些所谓的“坑”,大都是我们由于对原理不熟悉而自己挖出来的。

  3. 从垃圾回收角度看,Go语言的垃圾回收采用的是并发的标记清除算法(Concurrent Mark and Sweep,CMS)。虽然是并发的操作,时间比串行操作短很多,但是还是会在垃圾回收期间停止所有用户程序的操作。这一点多少会影响到对实时性要求比较高的应用。不过,在Go语言 1.3 之后的版本中,这方面的问题已经得到了极大的改善。

虽然Go语言还有一些瑕疵,但从整体来看,它已经是一门非常优秀的通用编程语言了。并且,Go语言在今后的发展上会关注性能、可靠性、可移植性和一些功能增强,所以上述缺憾会随着版本的推进而逐渐减弱和消失。