在过去的九年里,谷歌的Go语言 (又名Golang) (截至2019年9月发行的版本为1.13)已经从对alpha怪胎的好奇心演变为成为世界上一些最重要的语言背后经过考验的编程语言以云为中心的项目。
为什么Docker和Kubernetes等项目的开发人员选择了Go? Go的定义特征是什么?它与其他编程语言有何区别?它最适合构建哪种项目? 在本文中,我们将探讨Go的功能集,最佳用例,语言的遗漏和局限性,以及Go可能从何而来。
Go(通常称为Golang)是由Google员工(主要是长期的Unix专家和Google杰出的工程师Rob Pike)开发的,但严格意义上讲并不是“ Google项目”。 相反,Go是作为社区主导的开源项目开发的,由领导层牵头,领导层对应如何使用Go以及语言应遵循的方向持强烈看法。
Go的意思是易于学习,易于使用并且易于其他开发人员阅读。 Go没有太大的功能集,尤其是与C ++之类的语言相比时。 Go的语法让人联想到C,这使长期的C开发人员相对容易学习。 也就是说,Go的许多功能,尤其是其并发性和函数编程功能,都回溯到Erlang等语言。
作为一种用于构建和维护各种跨平台企业应用程序的类C语言, Go与Java有很多共同点 。 作为使快速开发可以在任何地方运行的代码的一种方法,您可以在Go和Python之间画出一个相似的地方,尽管差异远大于相似之处。
Go文档将Go描述为“一种感觉像动态类型的解释型语言的快速,静态类型的编译语言”。 甚至大型的Go程序也将在几秒钟内完成编译。 另外,Go避免了C风格包含文件和库的大量开销。
Go通过多种方式使开发人员的工作变得轻松:
没有一种语言适合所有工作,但是某些语言比其他语言适合更多的工作。
Go在开发以下应用程序类型方面表现最为出色:
实用程序和独立工具。 Go程序可以编译为二进制文件,并且具有最低的外部依赖性。 这使得它们非常适合创建实用程序和其他工具,因为它们启动Swift并且可以很容易地打包以便重新分发。
Go的自以为是的功能集受到赞扬和批评。 Go的设计偏向于小巧易懂,但特意省略了某些功能。 结果是故意无法在Go语言中使用某些其他语言中常见的功能。
这样的功能之一就是泛型,它允许函数接受许多不同类型的变量。 Go不包含泛型,并且基于泛型会损害语言的简单性,该语言的管理员反对添加它们。 可以解决此限制 ,但是许多开发人员仍然渴望看到以某种方式向Go添加了泛型。 至少有人提出了在Go中实现泛型的建议,但没有一成不变的建议。
Go的另一个缺点是生成的二进制文件的大小。 Go二进制文件默认情况下是静态编译的,这意味着运行时所需的所有信息都包含在二进制映像中。 这种方法简化了构建和部署过程,但以简单的“ Hello,world!”为代价。 在64位Windows上的重量约为1.5MB。 Go团队一直在努力减少每个后续发行版的二进制文件的大小 。 也可以通过压缩或删除Go的调试信息来缩小Go二进制文件 。 对于独立的分布式应用程序,最后一个选项可能比云或网络服务更好,后者在服务到位时具有调试信息很有用。
Go的另一个被吹捧的功能是自动内存管理,这可以看作是一个缺点,因为垃圾回收需要一定数量的处理开销。 从设计上讲,Go 不提供手动内存管理功能 ,而Go中的垃圾回收由于无法很好地处理企业应用程序中出现的各种内存负载而受到批评。 从好的方面来说,Go 1.8 对内存管理和垃圾收集进行了许多改进,从而减少了所涉及的滞后时间。 当然,Go开发人员确实能够在C扩展中或通过第三方手动内存管理库使用手动内存分配。
关于为Go应用程序(例如桌面应用程序中的应用程序)构建丰富的GUI的软件文化仍然散落。
大多数Go应用程序是命令行工具或网络服务。 也就是说,各种项目正在努力为Go应用程序带来丰富的GUI。 GTK和GTK3框架具有绑定。 另一个项目旨在提供平台原生的UI ,尽管它们依赖于C绑定并且不是用纯Go编写的。 Windows用户可以尝试散步 。 但是在这个领域还没有明显的赢家或安全的长期赌注出现,并且一些项目(例如Google试图构建跨平台GUI库的项目 )已经被抛在了一边。 另外,由于Go在设计上是与平台无关的,因此这些都不大可能成为标准软件包的一部分。
尽管Go可以与本机系统功能对话,但它并不是为创建底层系统组件而设计的,例如内核或设备驱动程序或嵌入式系统。 毕竟,Go运行时和Go应用程序的垃圾收集器依赖于底层操作系统。 (对这种工作感兴趣的最先进语言的开发人员可以考虑使用Rust语言 。)
Go开发的下一阶段很可能更多地由其开发人员基础的需求和需求驱动,Go的助手改变语言以更好地适应该受众,而不是仅凭example强的榜样。 换句话说,Go可能会获得原本不打算使用的功能,例如泛型。
显然,Golang开发人员想要这些东西。 2018年Go用户调查显示 ,在更广泛地采用Go以及更好的依赖关系和软件包管理方面,仿制药成为三大挑战。 GitHub上现有的关于泛型的提案仍然有效,作为Go 2.x的提案。 诸如此类的更改可能会帮助Go在企业开发中占据更中心的位置 ,在Java,JavaScript和Python当前占主导地位。
即使没有重大更改,我们也可以预期将Go用作基础结构重建项目,这是上述SSH和NTP的替代品,并且是多语言项目的一部分。
Go工具链的第三方实现也已激增。 ActiveState的ActiveGo提供了Go语言的商业支持版本,并且LLVM和gccgo项目都通过替代工具链提供了自由许可的Go开源实现。
最终,Go成为开发全新语言的基础,尽管其中的两个示例已停止积极开发。 一个例子是Have语言 ,该语言简化了Go语法,以自己的方式实现了一些相同的概念,并被转换为Go以便于执行。 另一个已解散的项目Oden使用Go的汇编器和工具链来编译一种新设计的语言,该语言从Lisp和Haskell等语言中获得了更多启发。
最后一组项目说明了任何IT创新真正革命性的方式之一-当人们将其拆散并重新调整用途时,发现其设计者从未打算使用的用途。 Go语言作为可入侵项目的未来才刚刚开始。 但是已经确定了它作为主要编程语言的未来,当然在云中也是如此,因为Go的速度和简便性简化了可扩展基础结构的开发,可长期维护该基础结构。
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!