当前位置: 首页 > 科技观察

Go编程语言的真正优势是什么?_0

时间:2023-03-12 02:33:52 科技观察

在其十多年的发展中,Google的Go语言(又名Golang)已经从极客的好奇心发展成为一些重要的以云为中心的项目背后经过验证的编程语言。为什么Docker、Kubernetes等项目的开发者都选择Go作为开发语言?Go有哪些特点优势,它与其他编程语言有何不同,它最适合构建什么样的项目?在本文中,我们探讨了Go的功能集、最佳用例、语言遗漏和限制,以及Go的发展方向。Go语言小巧简单Go(通常称为Golang)是由Google员工开发的——主要是长期的Unix大师和Google杰出工程师RobPike——但它并不是严格意义上的“Google项目”。相反,Go是作为一个社区主导的开源项目开发的,由对Go应该如何使用以及语言应该去哪里有强烈看法的领导层带头。Go意味着易于学习、易于使用,并且易于其他开发人员阅读。Go没有大量的功能集,尤其是与C++等语言相比。Go的语法让人想起C,这使得长期使用C的开发人员学习起来相对容易。也就是说,Go的很多特性,尤其是它的并发和函数式编程特性,都可以追溯到Erlang这样的语言。作为一种用于构建和维护各种跨平台企业应用程序的类C语言,Go与Java有很多共同之处。作为一种能够快速开发可在任何地方运行的代码的方法,您可以对Go和Python进行比较,尽管差异远大于相似之处。Go语言适合所有人Go文档将Go描述为“一种快速、静态类型的编译语言,感觉就像一种动态类型的解释语言”。即使是大型的Go程序也能在几秒钟内完成编译。此外,Go避免了C风格包含文件和库的大部分开销。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发行版中,例如RedHatEnterpriseLinux和Fedora,这使得将Go源代码部署到这些平台变得更加容易。Go支持在许多第三方开发环境中也很强大,从MicrosoftVisualStudioCode到ActiveState的KomodoIDE。Go最适合的地方没有一种语言适用于所有工作,但有些语言比其他语言更适合更多工作。Go最适合开发以下应用程序类型。云原生开发Go的并发和网络特性以及高可移植性使其非常适合构建云原生应用程序。事实上,Go已经被用于构建云原生计算的几个基石,包括Docker、Kubernetes和Istio。分布式Web服务Web应用程序的生死取决于并发性,而Go的本机并发性功能(主要是goroutines和通道)非常适合这项工作。因此,许多Go项目被用于网络、分布式函数和云服务:API、Web服务器、Web应用程序的最小框架等。实用程序和独立工具Go程序被编译成具有最小外部依赖性的二进制文件。这使它们成为创建实用程序和其他工具的理想选择,因为它们可以快速启动并且可以轻松打包以进行重新分发。一个例子是名为Teleport的访问服务器(用于SSH等)。通过从源代码编译或下载预构建的二进制文件,可以快速轻松地将Teleport部署到服务器上。Go语言因限制Go固执己见的功能集而受到赞扬和批评。Go的设计倾向于小巧易懂,有意省略了某些功能。结果是某些在其他语言中常见的特性在Go中根本不可用——这是故意的。一个长期存在的抱怨是缺少通用函数,它允许函数接受许多不同类型的变量。多年来,Go的开发团队一直拒绝向该语言添加泛型,认为他们想要一种语法和一组行为来补充Go的其余部分。但从2022年初发布的Go1.18开始,该语言现在包含泛型语法。要吸取的教训是,Go的主要功能添加很少见,并且只有经过深思熟虑才能保持跨版本的广泛兼容性。Go的另一个潜在缺点是生成的二进制文件的大小。Go二进制文件默认是静态编译的,这意味着运行时所需的一切都包含在二进制映像中。这种方法简化了构建和部署过程,但是以简单的“Hello,world!”为代价。在64位Windows上重约1.5MB。Go团队一直在努力减少每个后续版本中这些二进制文件的大小。也可以通过压缩或删除Go的调试信息来缩小Go二进制文件。最后一个选项对于独立的分布式应用程序可能比云或Web服务更有效,并且在服务失败时获得调试信息很有用。Go的另一个吹捧的功能,自动内存管理,可以看作是一个缺点,因为垃圾收集需要一定的处理开销。按照设计,Go不提供手动内存管理,并且Go中的垃圾收集因不能很好地处理企业应用程序中发生的各种内存负载而受到批评。也就是说,每个新版本的Go似乎都改进了内存管理。例如,Go1.8显着降低了垃圾收集的延迟。Go开发人员确实有能力在C扩展中使用手动内存分配,或者通过第三方手动内存管理库,但大多数Go开发人员更喜欢使用原生解决方案来解决这些问题。围绕为Go应用程序(例如桌面应用程序中的那些)构建丰富的GUI的软件文化仍然是分散的。大多数Go应用程序都是命令行工具或网络服务。也就是说,各种项目正在努力为Go应用程序带来丰富的GUI。有针对GTK和GTK3框架的绑定。另一个项目旨在提供平台原生UI,尽管这些UI依赖于C绑定并且不是用纯Go编写的。而Windows用户可以试试走走。但在这个领域还没有出现明显的赢家或安全的长期赌注,一些项目,如谷歌试图建立一个跨平台的GUI库,已经被搁置。此外,由于Go在设计上是独立于平台的,因此这些不太可能成为标准包集的一部分。尽管Go可以与本机系统功能通信,但它并不是为创建低级系统组件而设计的,例如内核或设备驱动程序,或嵌入式系统。毕竟,Go应用程序的Go运行时和垃圾收集器依赖于底层操作系统。(对此类工作的尖端语言感兴趣的开发人员可能会研究Rust。)Go的局限性Go的未来发展将更多地转向其开发人员社区的需求,而Go的思想家将改变语言以使其变得更好。适应这些受众,而不是以顽固的榜样为榜样。一个典型的例子是泛型,在经过深思熟虑后,泛型最终被添加到语言中。2021年Go开发者调查发现,Go用户普遍对该语言提供的功能感到满意,但也提到了很大的改进空间。Go用户希望改进的主要领域是依赖管理(Go中的一个持续挑战)、诊断错误和可靠性,而内存、CPU使用率、二进制大小和构建时间等问题的排名要低得多。大多数语言都倾向于一组核心用例。在Go存在的十年中,它的利基市场已经变成了Web服务,并且它可能会继续扩大它的影响力。总体而言,该语言的主要用例是创建API或RPC服务(49%),其次是数据处理(10%)、Web服务(10%)和CLI应用程序(8%)。Go语言越来越受欢迎的另一个指标是有多少开发者在评估后选择了它。在考虑将Go用于他们的项目的受访者中,75%选择了该语言。在没有选择Go的人中,Rust(25%)、Python(17%)和Java(12%)是首选。这些语言中的每一种都有或正在寻找其他利基市场:用于安全快速系统编程的Rust;用于原型设计、自动化和粘合代码的Python;以及用于长期企业应用程序的Java。Go的速度和开发简单性将在多大程度上将其应用到其他用例,或者Go将在多大程度上渗透到企业开发中,还有待观察。但Go作为主要编程语言的未来是有保证的——当然是在云中,Go的速度和简单性简化了可扩展基础设施的开发,这些基础设施可以随着时间的推移进行维护。原标题:Go编程语言到底有什么用?