深入浅出Go语言编程
上QQ阅读APP看书,第一时间看更新

1.3.4 为工程服务的语言

从Go语言的“出身”来看,它更像学院派语言,但实际上设计它的初衷是将其用作为工程服务的语言。Go语言具有开发效率高、代码规范统一、写并发相对容易等特点,非常适合团队开发。它的应用场景包括基础架构、中间件、云原生开发等。Go语言简化了指针设计,实现了将变量初始化为零值、通过 runtime 分配内存、内存逃逸分析以及自动垃圾回收等功能,让内存使用变得更为简单和安全。从这些实现细节中,我们可以深刻地认识到Go语言是一门为工程服务的编程语言。

1.静态强类型编译型语言

Go语言是一种静态强类型编译型语言,它具有以下特征。

(1)因为是静态语言,所以在程序运行之前就已经知道值类型是什么。这是一件很好的事情,可以在编译时就检查出隐藏的大多数问题。如果我们在错误的位置使用了错误的类型,Go语言就会及时告诉我们(比如常见的类型转换错误)。这减少了隐藏的缺陷(Bug),使线上的稳定运行成为可能。

(2)因为是强类型语言,所以类型之间的转换是显式的。

(3)因为是编译型语言,所以在运行前需要先生成二进制机器码。

提示:与静态语言相对的是动态语言。因为动态语言没有编译器,所以在执行过程中只能逐条地判断对错,如果出现问题,可能会立即崩溃或产生异常。静态语言会在编译过程中直接将源码转换为机器码,这意味着程序在运行时不需要实现额外的解释过程,因此可以提供更快的运行速度。此外,它还可以在编译过程中进行代码优化,如函数内联优化、消除死代码、展开循环等,以提高机器码的性能。

2.静态链接

关于静态链接和动态链接的争议一直存在。在笔者看来,在存储已经很便宜的今天,静态链接可能是更好的选择。Go语言正好属于静态链接库阵营。在Go语言中,一个几千字节大小的“hello world”程序编译后的可执行文件会达到几兆字节大小,这是因为Go语言在编译时会将一些静态链接库以及runtime环境打包到可执行文件中,虽然体积变大了,但程序更具可移植性和独立性了。不要低估了这一点,因为在复杂的生产系统中,使用动态链接可能会存在程序依赖于多个版本库的问题。此外,静态链接还具有另一个优势,即编译一次即可在任何地方运行。众所周知,部署Java程序需要在运行环境中安装JRE,而编译后的Go语言可执行文件并不依赖于任何运行环境,也就是说,它可以直接运行。这进一步证明了Go语言是以实用为主的工程语言。

3.编译速度快

“天下武功唯快不破”,程序的编译与执行也是如此。但是,对于快速编译和快速执行,我们往往只能选择其一,就像鱼与熊掌不可兼得一样。C语言运行速度快,但编译速度慢,依赖库运行时错误很多。Java的执行速度和编译速度都不错,但在不同的环境下,需要使用不同的 JVM运行代码。Go 语言一开始就考虑实现快速编译,就像解释型语言一样,我们不会注意到它正在编译。用Go语言编写的项目可以在秒级完成编译,这对提高生产力很重要!

4.执行性能高

Go语言虽然简单,语法糖少,但性能不差。它的性能略低于C++,相当于Java,比Python快几十倍。表1-1是The Benchmarks Game[2]中列出的编程语言性能数据,其中给出了在10种性能测试方法下多种语言的运行时间。


[2]The Benchmarks Game的官方地址为https://benchmarksgame-team.pages.debian.net/benchmarksgame,它是目前较为权威的为多种编程语言提供性能测试结果和评估的网站。

表1-1 10种性能测试方法下多种语言的运行时间对比(单位:秒)

图片表格

从表1-1可以看出,在这10种性能测试方法下,C++的性能最好,Go与Java差不多,Python要慢几个数量级。

5.支持跨平台交叉编译

Go语言支持跨平台交叉编译,可以轻松地根据指定的平台编译源码并运行。

6.拥有丰富的工具链

Go语言拥有丰富的工具链(命令行工具),包括编译、运行调试、下载和代码格式化等工具。