Go 语言以并发实现简单而著称,现在无数云原生项目都在用它。甚至在人工智能领域,它也开始发力了。今天我们就来聊聊这个由谷歌推出的热门编程语言。

问世十五年多了,Go 语言已经从技术爱好者眼里的“新鲜玩意儿”,成长为支撑全球关键云原生软件的成熟工具。
你可能好奇,为什么 Docker 和 Kubernetes 这些大项目都选 Go?这篇文章就是为了回答这个问题。我们会聊聊 Go 的核心特点,它和其他语言有什么不同,它最适合干什么,以及它现在的局限和未来。

Go(常被称为 Golang)是谷歌员工搞出来的,主要是 Rob Pike 这些 Unix 专家。不过它现在完全是由社区主导的开源项目。
Go 的设计初衷就是让人好学、好用。它的语法非常直观。和 C++ 这种功能繁多的语言比起来,Go 的功能集很小。它的风格有点像 C,所以如果你懂 C,上手 Go 会很快。不过,Go 在并发处理和函数式编程方面,其实吸收了不少 Erlang 这类语言的思想。
作为一个类 C 的通用语言,Go 在开发跨平台企业应用上和 Java 挺像。但因为它开发快、运行快,大家也常拿它和 Python 比,虽然它俩其实差别挺大。
官方文档说 Go 是“一种快速、静态类型的编译型语言,但用起来像动态类型解释型语言”。这话说得没错。就算是大项目,Go 编译起来也就是几秒钟的事。而且它没有 C 语言那种头文件和库引用的麻烦事。
Go 通用、方便、高效、可移植,而且现在支持它的工具也多。这就是为什么大规模软件开发喜欢用它。咱们具体看看。
在解决常见编程问题时,Go 的效率经常被拿来和 Python 比。Go 内置了很多实用功能,比如协程(goroutine)让并发变得很轻量。标准库里的 http 包也很强大。和 Python 一样,Go 也有自动内存管理,不用你自己手动管理内存。
Go 编译出来的程序,运行速度可能比 C 写的稍微慢一点点,但在绝大多数情况下,这个差距完全可以忽略不计。而在大多数任务中,Go 的性能接近 C,并且明显比 JavaScript、Python 和 Ruby 这些脚本语言快得多。
Go 编译出来的是独立的可执行文件,通常不需要依赖外部环境。它支持各种操作系统和硬件,跨平台编译也很容易。更重要的是,它既有高层抽象,又能直接访问底层系统。Go 程序可以直接调 C 库,也能执行原生系统调用。Docker 就是靠 Go 调用 Linux 的底层机制实现了容器功能。
Go 的工具链是免费的,Linux、macOS、Windows 都能用。很多 Linux 发行版都自带 Go。现在的开发环境,从 VS Code 到各种 IDE,对 Go 的支持都很好。
没有哪种语言是万能的,但 Go 在某些领域确实表现出色。主要是在云原生开发、分布式网络服务,还有写命令行工具这几块。
Go 的并发能力强,网络编程支持好,而且可移植性高,这让它成了构建云原生应用的首选。Docker、Kubernetes、Istio 这些云原生计算的核心项目,全是用 Go 写的。
网络应用的关键在于怎么处理并发。Go 原生支持的协程和通道(channel)机制,就是为了解决这个问题设计的。所以,很多网络服务、分布式系统、API、Web 服务器、微服务框架,都是 Go 的强项。
Go 编译出来的文件基本不依赖外部库,启动快,好分发。这让它特别适合写命令行工具。比如 Teleport 这个工具,你可以直接下载一个预编译好的二进制文件放到服务器上就能跑,非常方便。
说完优点,咱们也得客观看看 Go 的不足。
Go 为了保持简洁和可读性,故意砍掉了一些常见特性。这一点有人喜欢有人烦。
比如 Go 不支持宏(在编译期生成代码)。C++ 和 Rust 都有宏,Go 没有。Go 提供了一个 go generate 命令来做代码生成,但这和真正的宏系统还是有差距的。
另外,Go 很长一段时间都不支持泛型。直到 2022 年发布的 Go 1.18 版本,泛型才终于加进来。
Go 很少加重大新特性,这保证了版本兼容性,但也让语言演进显得有点慢。
Go 编译出来的文件体积偏大。因为它是静态链接,把运行需要的东西都打包进去了。这虽然方便部署,但也让文件变大了。一个简单的“Hello World”在 Windows 上可能就有 1.5MB。
Go 的自动内存管理很方便,但垃圾回收是需要消耗计算资源的。Go 不提供手动内存管理接口。虽然每个新版本都在优化,但在需要极度精细控制内存的场景下,这可能是一个短板。
Go 主要还是用来写命令行和网络服务的。虽然有第三方库尝试做 GUI,但目前还没有一个公认的标准解决方案。
Go 可以调用底层接口,但它不适合开发操作系统内核或驱动程序。因为 Go 依赖垃圾回收和运行时,没法完全脱离操作系统独立运行。这种活儿,Rust 更合适。

Go 的团队现在越来越重视社区的反馈了。泛型的加入就是个例子。
调查显示,开发者对 Go 总体是满意的。现在的痛点主要在错误处理比较繁琐、框架生态还不够成熟这些方面。
Go 在网络服务领域的地位已经很稳固了。未来,它在这块还会继续加强。虽然现在用 Go 做 AI 的还不多,但已经有人在尝试了。阻碍 Go 在 AI 领域发展的主要是工具链还不如 Python 完善。
总的来说,Go 作为一种主流编程语言,地位已经确立了。特别是在云原生开发领域,它兼顾了高性能和开发效率,是构建基础设施的理想选择。