Go 语言优势与行业前景

18 minute read

在我开始从事 Golang 工作的时候,并没有去了解过 Golang 的前景是如何的。可能是自己的直觉,也可能是对这门编程语言有着迷之信仰,又或者当前 Golang 工程师的薪资待遇稍微高点,就莫名开始从事这么语言的程序开发工作。今天有个机会在小组做分享,也可以将之前落下的功课都补回来,同时我自己也好奇,这门语言的技术生态。

下面我就以六个主题来介绍这门语言,分别是:

  • 前生今世
  • 多方优势
  • 自身优势
  • 应用场景
  • 市场行情
  • 从业建议

大家在学编程的路上有没有想过一件事,我们学习编程语言的目的是什么?解决问题。解决项目问题,解决公司问题,解决顾客问题,解决社会问题,最重要的是解决我们自己的生活温饱问题或者说学业就业问题吧。

现在各大互联网公司都在极力储备 Golang 的人才,主要还是微服务 docker 的成功,它成为了 Go 语言的第一个 killer 杀手级应用,很多公司都会使用 docker 来部署他们的系统,也会用 Go 来开发许多新的系统。包括谷歌脸书 BAT、美团滴滴七牛云、京东小米360 等也都在招聘 Golang 工程师。

image-20211127215319021

前生今世

当我们选择了一门编程语言,很可能意味着选择了一段历史、一个技术生态。

早在 2007 年,有三位 Google 的大佬程序员在进行一个有趣的讨论,就是下面三位看起来《平凡》的人。

img

那时候谷歌公司的产品和应用多是用 C++ 来写的,复杂性巨大,了解过 C++ 的同学也知道,相比于现在流行的 Java、Python,非常复杂。并且它们公司那样巨无霸的产品用 C++ 来编译构建速度非常慢,对一些服务端程序的并发支持也不友好。

然后他们三个好基友拍一拍头,握握手,就设计出了 Go 语言,并且第二年也是 Unix 之父的 Ken Thompson (第三位白胡子老爷爷)实现了第一版 Go 编译器,用来验证之前的设计。直到 2009年 11 月 30 日,Go 语言开源了。

Go 语言一经发布后就吸引了一些公司,尤其是云计算领域的初创公司成为了 Go 语言的早期接纳者和布道者。一些公司中还诞生了像 Docker、Kubernetes 这样的“杀手级”或示范性项目,这些项目也让 Go 语言真正地被称誉为“云计算语言”。

有个有趣的事,每次我们看到 Go 语言都会想起这个小地鼠:

它其实是由 Rob Pike (中间那位)的夫人 Renee French 设计的地鼠,从此以后呢这个地鼠就成了了我们全世界 Go 程序员的象征,我们 Go 程序员也被称叫做 Gopher。是不是还是挺有意思的。

和绝大多数编程语言相似,Go 语言也是“站在巨人的肩膀上的”,Go 继承了很多编程语言的特性,不过最基本的语法是参考的 C 语言的。

多方优势

  • 可直接编译成机器码,不依赖其他库。相比 Python 吧,比如我们写好一个 Python 应用,它就是一个单纯的脚本,在我这台电脑上可以运行,但在你的电脑上运行是不是还得 pip 去安装一些包呀。Golang 不会,它会在运行之前就进行编译,把需要的包都打包到一起,所以我这里能使用的,放在你的电脑上也可以直接运行,零添加零污染。
  • 静态类型编译,动态语言用法。静态类型语言可以在编译的时候检查出隐藏的大多问题,动态类型语言就是有很多包可以使用,使用起来效率很高。Go 就是结合这二者的静态语言。
  • 天生支持并发。这是 Go 最大的特殊,因为 Go 在设计中就支持并发,可以充分利用多核,并且只需要用到关键字 go 很容易使用到并发。而 Python 想要使用并发就需要用到并发模块,不同模块在不同场景性能还不一。
  • 内置 runtime,支持垃圾回收。这个动态语言设计中比较常见。
  • 简单易学,上手快。Go 语言传承了 C 的基因,仅 25 个关键字但能够表达大多数情况,同时支持多数其他语言的特征:继承、重载、对象等。
  • 标准库很丰富。Go 语言已经内置了大量的库,特别是网络库方面非常强大。
  • 内置强大工具。比如 gofmt 能够自动格式化代码,如果团队联合开发的话做代码审查 review 变得更加简单,代码格式一模一样,想不一样都难。有接手过别人项目的同学感触应该很深刻。
  • 跨平台编译。如果 Go 代码不包含 cgo,那么可以直接用 Windows 编译 Linux 的应用。我们知道编程语言有时开发的工具会和操作系统有关,或者是里面用到的包也会和操作系统有关。但 Go 引用了 plan9 的代码,也就意味着不依赖系统的信息。
  • 内嵌支持 C。因为 Go 的作者也是 C 的作业,所以可以在 Go 代码中直接包含 C 的代码,并且有很多可以利用的 C 库。
  • 社区活跃。在国内,不仅支持者较多,还有专门的社区,比如 GOCN,Go 语言中文网等,全国各地不定期会举行开发者下线分享会 meetup 来促进 Go 语言传播和交流。国外还为我们国家专门做了一个中国的镜像网站,让国内开发者快速访问、了解 Go 语言相关知识。全球最大基友社区 Github 还将许多 Go 优秀项目开源托管了起来,比如 docker、k8s。
  • 微服务的蓝海。成名之作 docker 树立起了 Go 语言可用在微服务的场合,所以在中间件、网络服务、高并发等场景中有很大的优势,会被优先考虑和使用。
  • 区块链的助推。大数据、云计算、物联网、人工智能、区块链等五大技术现在都已经被国家认定为高科技技术工具,并且广泛使用在利民中。区块链的 2.0 以太坊就是完全用 Go 语言写的,对 Go 语言的促进作用非常非常大。并且区块链联盟中,由 IBM 发起的超级账本,主要针对企业级的联盟链。如果开发者从事区块链开发一般都会要求会 Go 语言,并且薪资待遇普遍较高。

自身劣势

  • 导入包 import 不支持版本。虽然升级包的版本容易,但可能导致项目不可用,就需要自己控制版本信息。
  • 并发代码需要严格逻辑。Go 的 Goroutine 一旦启动后,不同 Goroutine 之间的切换是不受程序控制的,尤其 runtime 调度时,需要严谨逻辑,不然 Goroutine 一旦休眠,过段时间逻辑结束,这个 Goroutine 又冒出来执行,最终导致结果异常。
  • 垃圾回收延迟略大。如果同时并发很大的情况下,处理很大的日志,GC 相应没那么快。
  • pkg 中的图片处理库问题很多。因为侧重点不在这里,所以这个库 bug 比较多,要使用还是用成熟库如 imagemagick 比较靠谱。
  • 语法重载严重。比如关键字 for 可以用来作为循环,还可以用来作为嵌套分支判断。虽然看上去简单了,但引起了混淆,增加了人脑的开销。而像 Python 的循环有三种 while, do while, for,功能其实不全一样,但不同场景使用阅读体验不一样。
  • 强制语法。比如强制把 { 放在一行之后而且不能换行,if 语句的判断开头可以嵌套赋值操作等等。虽然这些作法试图让程序显得短小,但其实反而降低了程序理解的流畅度。
  • 工具链不完善。虽然之前说有一些很好用的工具,但比起像 Eclipse, IntelliJ 和 Visual Studio 这样的 IDE,差距还是相当大的。
  • 内存管理性能偏低。Go 的垃圾回收器,我也研究了一下,其实是一个非常原始的标记清扫 mark-and-sweep,这比起像 Java 其实还处于起步阶段。虽然 Go 程序员能够通过改善内存回收来解决遇到的 GC 性能问题,但也说明了Go 的垃圾回收还非常不成熟。
  • 没有泛型。没有泛型 generics 意味着你我们不得不重复写很多函数,且每一个只有类型不同。这个在问题直到 Go1.17 版本后才得以初步解决。
  • 多返回值。Go 的多返回值却被大量的用在了错误的地方—比如利用多返回值来表示出错信息。因为没有异常,如果程序中出现问题就需要返回错误。而如果接收值没有接受这个错误值并且判断,这个错误就会被跳过。
  • 并非真正大并发。虽然 Goroutine 并发很好使用,但理解程序语言理论就会发现,其实 goroutine 只是用户级别的 continuation,而系统级别的 continuation 通常被叫做“进程”或“线程”。

应用场景

  • 服务器编程。如果之前使用 C 或者 C++ 来做一些事情,现在用 Go 来做很合适。比如处理日志、数据打包、虚拟机处理、文件系统等。
  • 分布式系统。
  • 数据库代理器。
  • 网络编程。这块目前应用最广,包括 Web 应用、API 应用、下载应用。
  • 内存数据库。比如 Google 的 groupcache,couchbase 的部分组件。
  • 云平台。目前很多国外的云平台都是采用 Go 开发的,如 CloudFoundy 的部分组件,apcera 云平台。
  • GUI 与 图像处理。

市场情况

很多时候我们谈论一门技术都在说这个语言本身怎样、应用场景怎样。但对于我们普通人来说,很多时候都是有点脱离实际的。

谈钱,永不过时。相比其他语言程序员,这里只以较为大众化的语言来对比。作为一哥的 Java 家大业大,基业长青。而 Go 语言虽然只是编程界的新秀,Go的招聘越来越多,如果说多学会一门 Go 编程语言的话,其实找工作的路子就更宽了,而且薪水也是比以前会更高一些。

已经是 2021 年了,现在公司里多数 Go 程序员其实都是半路出家转到 Go 的,以 Go 作为第一门技术栈的人非常少。目前很多转 Golang 的开发者,大部分是以前写 PHP、C++、或者 Python 的。虽然说 PHP 是最好的语言,在小公司非常受欢迎,因为它能快速做出产品、快速上线。但对于成型的公司,它们更加注重前后端分离、模块化和服务化,PHP 已经在被边缘化了。对于像 PHP 开发者来说,他们很难转向学习 Java 这种语言,因为学习成本太高了,所以他们最好的出路就是往 Go 语言转,毕竟 PHP 和 Go 都是 C 语言系的。同时,Go 语言上手快,如果掌握了,又有几年从事 PHP 的实际开发经验,把么用人单位还是很青睐这种开发者的。

还有一个前景情况是,即便在今天,前端的编程语言仍然是标准的 JavaScript。不是因为 Js 什么都能做,什么都能做好,而是因为它的流行完全基于“垄断地位”,Go 的出现已经使这种情况发现了一些变化。所以这门语言还是值得大家好好学习,因为它真的可以做从底层到前端的任何工作。

image-20211127214913312

从业建议

总的来说,我对 Go 语言是很看好的。如果想深入计算机偏底层的设计,喜欢往基础架构走,那么这门语言就是很好的帮手。之后我们在项目遇到问题,需要考虑使用哪种语言时,就能够对比选择实现效率更高,成本更低的。亦或者在招聘的时候希望找薪资待遇不错的。总之,多学会一门语言,多了几种选择

参考资料

[1] 为什么要使用 Go 语言?Go 语言的优势在哪里?asta谢 https://www.zhihu.com/question/21409296

[2] Python 初学者应该如何在 Rust 和 Go 之间选择?asta谢 https://www.zhihu.com/question/26446838/answer/32904295

[3] Go语言的前景分析, 飞雪无情 https://www.flysnow.org/2018/05/14/go-prospect-analysis.html

[4] 对 Go 语言的综合评价, 王垠 http://www.yinwang.org/blog-cn/2014/04/18/golang

[5] 再谈 Go 语言在前端的应用前景, 许式伟 https://www.infoq.cn/article/203ol6ogtdzbeq1e00sy

[6] 许式伟:相比 Python,我们可能更需要 Go+ https://segmentfault.com/a/1190000039805037