今年早些时候 Stack Overflow网站发布了2021年开发者调查。如果你经常关注技术新闻,你就会发现一个很奇怪的现象,Golang语言已经超过C++、Java、C#等老牌编程语言,成为开发者最想学习的语言排行第4,排在前面的是Python和Typescript、Javascript。

它不是世界上最流行的编程语言。使用它的开发人员数量相对较少。

Go 相对较新且不成熟。它是一种基本语言,缺少其他语言所具有的许多语法糖。它没有任何流行的框架来自动化繁琐的样板。直到三年前,它还没有标准化的包管理器。

然而在tiobe.com语言流行榜单种Golang仅仅排名第14,这是为什么能让他成为开发者新的首选呢?

性能优势

根据 Go 语言 开发团队和基本的算法测试,Go 语言与 C 语言 的性能差距大概在 10%~20% 之间。虽然没有官方的性能标准,但是与其它各个语言相比已经拥有非常出色的表现。

时下流行的语言大都是运行在虚拟机上,如:Java 和 Scala 使用的 JVM,C# 和 VB.NET 使用的 .NET CLR。尽管虚拟机的性能已经有了很大的提升,但任何使用 JIT 编译器和脚本语言解释器的编程语言(Ruby、Python、Perl 和 JavaScript)在 C 和 C++ 的绝对优势下甚至都无法在性能上望其项背。

通过对 C(gcc)、C++、Java、JavaScript 和 Go 语言的测试。性能比较如下表所示,表中数据的单位为秒,数值越小表明运行性能越好。

通过上表可以看出,Go 语言在性能上更接近于 Java 语言,虽然在某些测试用例上不如经过多年优化的 Java 语言,但毕竟 Java 语言已经经历了多年的积累和优化。

Golang 在未来的版本中会通过不断的版本优化提高单核运行性能。

不错的薪水

Go 语言开发者的薪资也水涨船高。据职友集统计,中国 Go 语言开发工程师的平均月工资为 21.8k 。从全球范围来看,Go 语言的开发者的薪酬也是位列前茅,结合其并不高的声量和使用率,可以说是「闷声赚大钱」了。

Go是天然云原生语言

说云计算已经改变了科技行业是轻描淡写的。公司不再需要建立服务器群并雇佣团队来维护它们。云提供商已经将服务器变成了一种商品。工程团队现在可以通过单击按钮启动虚拟机。

云计算的兴起导致了对可帮助团队在云上管理和扩展其架构的技术的需求。于是云原生诞生了。

Terraform、Docker 和 Kubernetes 等技术使使用微服务在云上部署、扩展和管理应用程序变得前所未有的简单。它们是Git 背后最受欢迎的开发工具。它们都是用 Go 构建的。

不仅仅是 Docker 和 Kubernetes。云原生计算基金会赞助的绝大多数项目都是用 Go 编写的。

Go 是为云和微服务而构建的。它是为多核服务器设计的。它可以轻松地交叉编译到各种体系结构和操作系统。它也非常轻巧。它编译的二进制文件比 Java 中的类似二进制文件小 10 倍。它们不仅更小,而且编译速度也更快。

Kubernetes 拥有超过 500 万行应用程序代码。如果用任何其他语言编写,编译可能需要几十分钟到几小时。使用 Go,只需一两分钟。

Go适用场景

1. 分布式应用

Golang 是非常适合在分布式应用场景下开发的。分布式应用的主要目的是尽可能多的利用计算资源和网络带宽,以求最大化系统的整体性能和效率,其中重要的需求功能就是并发(Concurrency)。而 Go 是支持高并发和异步编程方面的佼佼者。

前面已经提到,Go 语言内置了协程(Goroutine)和通道(Channel)两大并发特性,这使后端开发者进行异步编程变得非常容易。Golang 中还内置了sync 库,包含 Mutex(互斥锁)、WaitGroup(等待组)、Pool(临时对象池)等接口,帮助开发者在并发编程中能更安全的掌控 Go 程序的并发行为。Golang 还有很多分布式应用开发工具,例如分布式储存系统(Etcd、SeaweedFS)、RPC 库(gRPC、Thrift)、主流数据库 SDK(mongo-driver、gnorm、redigo)等。这些都可以帮助开发者有效的构建分布式应用。

2. 网络爬虫

稍微了解网络爬虫的开发者应该会听说过 Scrapy,再不济也是 Python。市面上关于 Python 网络爬虫的技术书籍数不胜数,例如崔庆才的《Python 3 网络开发实战》和韦世东的《Python 3 网络爬虫宝典》。用 Python 编写的高性能爬虫框架 Scrapy,自发布以来一直是爬虫工程师的首选。

不过,由于近期 Go 语言的迅速发展,越来越多的爬虫工程师注意到用 Golang 开发网路爬虫的巨大优势。其中,用 Go 语言编写的 Colly 爬虫框架,如今在 Github 上已经有 13k+ 标星。其简洁的 API 以及高效的采集速度,吸引了很多爬虫工程师,占据了爬虫界一哥 Scrapy 的部分份额。前面已经提到,Go 语言内置的并发特性让严重依赖网络带宽的爬虫程序更加高效,很大的提高了数据采集效率。另外,Go 语言作为静态语言,相对于动态语言 Python 来说有更好的约束下,因此健壮性和稳定性都更好。

3. 后端 API

Golang 有很多优秀的后端框架,它们大部分都非常完备的支持了现代后端系统的各种功能需求:RESTful API、路由、中间件、配置、鉴权等模块。而且用 Golang 写的后端应用性能很高,通常有非常快的响应速度。笔者曾经在开源爬虫管理平台 Crawlab 中用 Golang 重构了 Python 的后端 API,响应速度从之前的几百毫秒优化到了几十毫秒甚至是几毫秒,用实践证明 Go 语言在后端性能方面全面碾压动态语言。Go 语言中比较知名的后端框架有 Gin、Beego、Echo、Iris。

当然,这里并不是说用 Golang 写后端就完全是一个正确的选择。笔者在工作中会用到 Java 和 C#,用了各自的主流框架(SpringBoot 和 .Net Core)之后,发现这两门传统 OOP 语言虽然语法啰嗦,但它们的语法特性很丰富,特别是泛型,能够轻松应对一些逻辑复杂、重复性高的业务需求。因此,笔者认为在考虑用 Go 来编写后端 API 时候,可以提前调研一下 Java 或 C#,它们在写后端业务功能方面做得非常棒。

最后的思考

在理解 Go 语言的优势和适用场景的同时,我们必须意识到 Go 语言并不是全能的。它相较于其他一些主流框架来说也有一些缺点。开发者在准备采用 Go 作为实际工作开发语言的时候,需要全面了解其语言特性,从而做出最合理的技术选型。就像打网球一样,不仅需要掌握正反手,还要会发球、高压球、截击球等技术动作,这样才能把网球打好。

每种语言都有其利基。JavaScript 有 Web 开发。Python 有数据科学。Ruby 有初创公司。Java 有企业级。Go 有云。

尽管只有十年的历史,Golang 已经取得了成功。随着云计算的主导地位的蔓延,Go 的未来看起来比以往任何时候都更加光明。