Go 的真正优势是什么?
导读:了解 Google 热门编程语言的优势、劣势、用例和未来方向。
Google 的Go 语言,又名Golang 。
它在其十多年的发展历程中,已经从 alpha 极客的好奇心发展成为经过实战的编程语言,背后是一堆世界上以云计算为中心的项目做为最佳实践。
那么,为什么Docker和Kubernetes等项目的开发者会选择 Go 开发?Go 的定义特征是什么,它与其他编程语言有什么不同,最适合开发啥样的项目?
在本文中,我们将探讨 Go 语言的功能集、最佳用例、语言的遗漏和限制,以及 Go 的未来发展方向~
Go 小而简单
Go,或者通常所说的 Golang,是由谷歌员工开发的,长期和主要的贡献者是 Unix 大师和Google 杰出工程师 Rob Pike。
但严格来说,它也不是一个纯“Google项目”。相反的,Go 是作为一个社区主导的开源项目开发的,由领导层带头,他们对 Go 的使用方式和语言的发展方向有强烈的主观看法。
Go 易于学习、易于使用并且易于其他开发人员阅读。Go 没有大量的功能集,特别是与 C++ 等语言相比。Go 的语法让人想起 C,这使得长期使用 C 开发的人员来说,学习起来相对容易。也就是说,Go 的许多特性,尤其是它的并发和函数式编程特性,也可以追溯到 Erlang 等语言。
作为一种用于构建和维护各种跨平台企业应用程序的类 C 语言,Go 与 Java 也有很多共同之处。作为一种能够快速开发可能在任何地方运行的代码的方法,你也可以在 Go 和 Python 之间进行比较,尽管差异要大于相似之处。
Go 适合每个人
Go 的用户开发文档将 Go 描述为“一种快速、静态类型的编译语言,感觉像是一种动态类型的解释语言。” 即使是大型 Go 程序也能在几秒钟内完成编译。
此外,Go 避免了 C 语言包含文件和库的大部分开销。
因此综上所述,Go 正以多种方式让开发者的生活更轻松。
Go 很方便
在满足许多常见编程需求的能力方面,Go 与 Python 等脚本语言进行了比较。
其中一些功能已经内置在语言本身中,例如用于并发和线程类行为的“goroutines”,而 Go 标准库包中提供了其他功能,例如 Go 的 http 包。
与 Python 一样,Go 也提供了自动内存管理,垃圾收集等功能。
与 Python 等脚本语言不同,Go 代码编译为快速运行的本机二进制文件。与 C 或 C++ 不同的是,Go 的编译速度非常快——足以让使用 Go 感觉更像是使用脚本语言而不是编译语言。
此外,Go 构建系统没有其它编译语言那么复杂。构建和运行 Go 项目只需要几个步骤和很少的标记就能搞定。
Go 运行很快
Go 的二进制应用,运行速度仍比 C语言对应要慢,但对于大多数应用程序来说,这个速度上的差异可忽略不计。
对于绝大多数工作而言,Go 的性能可以与 C 一样好,并且通常比其他以开发速度着称的语言(例如 JavaScript、Python 和 Ruby)要快得多。
Go 轻巧便携
使用 Go 工具链创建的可执行文件可以独立存在,没有外部依赖项。另外,Go 工具链可用于各种操作系统和硬件平台,并可用于跨平台编译二进制文件。
Go 具备可互操作
Go 在不牺牲对底层系统的访问的情况下提供了互操作功能。Go 程序可以与外部 C 库对话或进行本地系统调用。
例如,在 Docker 中,Go 与低级 Linux 函数、cgroup 和命名空间接口,以发挥容器的法力。
Go 有广泛的系统支持
Go 工具链可作为 Linux、MacOS 或 Windows 二进制文件或 Docker 容器免费提供。
Go 默认包含在许多流行的 Linux 发行版中,如 Red Hat Enterprise Linux 和 Fedora,这使得将 Go 源代码部署变得更加容易。从 Microsoft Visual Studio Code 到 ActiveState 的 Komodo IDE,许多第三方开发环境对 Go 的支持广泛并且很强大。
Go 什么地方工作得最好
没有一种编程语言适合所有类型的工作,但有些语言比其它语言适合更多。
Go 语言最适合开发以下应用程序类型:
1)云原生开发
Go 的并发和网络特性以及高度的可移植性使其非常适合构建云原生应用程序。事实上,Go 已经用于构建云原生计算的多个基石,包括Docker、Kubernetes和Istio。
2)分布式网络服务
网络应用程序的好坏取决于并发。Go 的原生并发特性——主要是goroutine 和 通道——非常适合这种工作。
许多 Go 项目用于网络、分布式功能和云服务: API、 Web 服务器、 Web 应用程序的微框架等。
3)实用程序与独立工具
Go 程序可编译成具有最少外部依赖的二进制文件。这使得它们非常适合创建实用程序和工具,它们可以快速启动并且可以很容易地打包以便重新分发。
举栗来说,有一个用Go开发的称为 Teleport 的工具(用于 SSH 等),Teleport 可以通过从源代码编译或下载预构建的二进制文件快速轻松地部署于服务器端。
Go 的限制
上面 Go 自以为是的功能既受到赞扬也受到批评。
Go 的设计倾向于小而易于理解,故意省却了某些功能。结果是某些在其它语言中很常见的功能在 Go 中根本不能用,这明显是故意的。
有一个开发者长期存在的抱怨是缺乏通用函数,它允许函数接受许多不同类型的变量。
很多年来,Go 的开发团队一直反对在语言中添加泛型,理由是他们想要一种语法和一组行为来补充 Go 的其余部分。
但从 2022 年初发布的 Go 1.18 开始,该语言现在已经包含泛型语法。Go 很少添加主功能,而且只有经过深思熟虑,才能更好地保持跨平台跨版本的广泛兼容性。
Go 的另一个缺点是生成的二进制文件的尺寸。
Go 二进制文件默认是静态编译的,这意味着运行时所需的一切都包含在二进制映像中。这种方法简化了构建和部署过程,但代价是占地空间有点大。
比如简单的“Hello,World!”, 在 64 位 Windows 上占地约 1.5MB。Go 团队也一直在努力减小这些二进制文件的大小,另一方面可以通过压缩或删除 Go 的调试信息来缩小 二进制文件大小。
Go 的另一个被吹捧的特性,自动内存管理,也被视作一个缺点。因为垃圾收集也需要一定量的处理开销。按照设计,Go 不提供手动内存管理,Go 中的垃圾收集因无法很好地处理企业应用程序中出现的各种内存负载而受到很多批评。
每个新版本的 Go 均优化了内存管理功能。Go 1.8显着缩短了垃圾收集的延迟时间。Go 开发者也有能力在 C 扩展中使用手动内存分配,或者通过第三方手动内存管理库,但大多数 Go 开发人员更喜欢本地解决方案来解决这些问题。
此外,围绕为 Go 应用程序(例如桌面应用程序)构建 GUI 的技术仍然是分散的。
大多数 Go 应用程序都是命令行工具或网络服务。Go也正在努力为应用程序带来图形界面,此外Go也在正与GTK 和 GTK3 框架进行绑定集成 。
Go的一个项目目标提供平台原生 UI,尽管这些依赖于 C 并且不是用纯 Go 编写的。Windows 用户可以试试 walk 项目。谷歌试图建立一个 跨平台的 GUI 库,现在已经被搁置了。由于 Go 在设计上是独立于平台的,这些不太可能成为标准包的一部分。
Go 可以与本地操作系统函数通信,但它并不是为创建低级系统组件而设计,例如内核或设备驱动程序或嵌入式系统。
Go 应用程序的 Go 运行时和垃圾收集器依赖于底层操作系统。对此类工作的尖端语言感兴趣的开发者可以研究 Rust 语言。
Go 的未来
Go 的未来发展将更多地面向开发者群体的需求,Go 的思想者会改变语言以更好地适应用户,而不是通过顽固化的自我标榜来引领。
一个典型的例子是泛型结构,在对这种方法进行了深思熟虑之后,Go团队最终将其添加到语言中。
Go 用户总体上对该语言的功能感到满意,但也提出了改进空间。用户希望改进的主要领域是依赖管理(Go 中的一个持续挑战)、诊断错误与可靠性,而内存、CPU 使用率、二进制大小和构建时间等问题的排名要相对低得多。
大多数语言都倾向于一组核心用例。该语言的主要用例包括创建 API 或 RPC 服务 (49%),其次是数据处理 (10%)、Web 服务 (10%) 和 CLI 应用程序 (8%)。
Go 语言越来越受欢迎的另一个标志是有多少开发者在理性评估后选择了它。在考虑使用 Go 进行项目开发的受访者中,75% 的人最终选择了该语言。
在没有选择 Go 的人中,Rust (25%)、Python (17%) 和 Java (12%) 是首选。Rust 用于安全和快速的系统编程;用于原型设计、自动化和粘合代码的使用 Python ;用于长期企业应用程序的用 Java 语言。
Go 的运行速度和开发简单性会在多大程度上将其带入相关用例,或者 Go 在多大程度上渗透到企业开发中,还有待时间观察。
但是 Go 作为主要编程语言的未来已经得到保证,它的主流应用目前是在云中,它的速度和简单性简化了需要长期维护的可扩展基础设施的开发。
作者:场长
相关阅读: