农业资讯网
当前位置: 首页 农业百科

go语言的重要性(语言生态发展之路)

时间:2023-05-23 作者: 小编 阅读量: 1 栏目名: 农业百科

2013年5月,Go1.1发布,这个版本的编译器、垃圾回收机制、goroutine调度器性能均有增强。2018年8月,Go1.11版本引入了Go模块功能,以响应在当年语言调研中反馈的模块管理问题;增加了实验性的WebAssembly支持。2020年8月,Go链接器得到了实质性的提高,减少了30%的内存资源占用,提高了代码的可维护性。参与社区提交Issue的用户数量也在持续增长,不过目前开启中的Issue仍有超过7000个,有近一半为“待调查分类”,可能为无效的Issue。

2007 年 9 月 21 日,Robert Griesemer,Rob Pike 和 Ken Thompson 在一块白板上勾勒了一个新语言,并在几天内定下了计划和目标,作为一个自由时间的项目进行;2008 年年中,这个项目得到 Google 的全力支持,成为了一个全职项目;2009 年 11 月,Go 语言正式开源 [1],并于三年后发布 1.0 版本。发布 12 年至今,已有上百万开发者成为“gopher”,已经远超设计者最初的预期。

# 源起 #

Go 语言的开发团队可以说是高人云集:Ken Thompson 创造了 B 语言(C 语言前身),是 Unix 和 Plan9 操作系统的创立者之一,和 Dennis Ritchie 一起获得了 1983 年的图灵奖;Rob Pike 是 Unix 小组成员,也是 Limbo 语言和 UTF-8 编码的主要设计者;Robert Griesemer 曾参与制作 Google 的 JavaScript 引擎 V8、Java 的 HotSpot 虚拟机和领域特定语言 Sawzall [2](Sawzall 最早被 Google 用于处理大批量日志,后来基本被 Go 取代[3])。

Go 语言的三位创始人在 Google I/O 2012 - Meet the Go Team

随着 Go 的发展,出现了一些声音称 Go 语言没什么技术优势,而 Rob Pike 对此的态度是“你们是对的”,Go 语言本身 “并不有趣”,其设计初衷不是为了推动编程语言设计的进步,是为改善软件工程的工作环境而生 [4]

当时 Google 面临着软件大规模增长的问题,开发方式变得缓慢而笨拙。规模化在各种维度上均存在,比如多核并行、生产需求和依赖关系等,导致硬件和软件都非常大,很多软件的代码多达百万行(大部分使用 C、Java 或 Python)。Go 语言的诞生解决了大规模的软件开发中一些核心痛点,比如开发缓慢、不受控制的依赖关系、代码理解困难和重复造轮子等。 [5]

官网描述 Go 语言可用于构建“简单、可靠、高效的大规模软件”,JetBrains 2021 年的最新调研报告显示,程序员们在工作中使用 Go 语言的比例达到了 61%(Rust 语言用于工作的比例仅 16%) [6]

使用 Go 的场景

可见 Go 确实不是一门“有趣”的编程语言,而更看重工程实践中的实用性,Go 语言设计中的方方面面都在体现这一点。

# 演进 #

版本更新历史 [7][8]

  • 2012 年 3 月,语言第一个正式版本 Go 1.0 发布,同时还有一份兼容性说明文档说明未来版本会确保向后兼容性。

  • 2013 年 5 月,Go 1.1 发布,这个版本的编译器、垃圾回收机制、goroutine 调度器性能均有增强。

  • 2014 年 12 月,Go 1.4 发布,堆栈大小减少了 10~30%;Android 官方支持包随版本一起发布;同时 Go 项目从 Google Code 迁移到了 GitHub。

  • 2015 年 8 月,Go 编译器实现自举,完全移除了 C 语言;重新设计了垃圾回收器,支持并发,垃圾回收延迟显著降低,此后版本对垃圾回收器有更进一步的优化。

  • 2018 年 8 月,Go 1.11 版本引入了 Go 模块功能,以响应在当年语言调研中反馈的模块管理问题;增加了实验性的 WebAssembly 支持。

  • 2019 年 9 月,Go 1.13 版本中,改进了 sync 包 Pool 组件的资源被垃圾回收器清除的机制;重写了逃逸分析逻辑。

  • 2020 年 8 月,Go 链接器得到了实质性的提高,减少了30% 的内存资源占用,提高了代码的可维护性。

  • 2021 年 2 月,Go 1.16 支持了 macOS ARM64;同时默认使用 Go 模块功能(同样来自调研报告反馈的情况)。

  • 2021 年 8 月,Go 1.17 发布,增加了对 Windows ARM64 的支持;语言有三个小的增强(unsage 包的两个新函数和语言类转换规则的扩展)。

Go 语言并没有特别激进的新特性,而是从早期的编程语言中继承了很多内容,并做了有效的组合 [9]

影响 Go 语言设计的早期编程语言

Go 语言里一些广受开发者喜爱的特性 [10]

  • 并发性:这是 Go 语言最大的特色,从语言层面支持并发,goroutine 和 channel 可以非常容易的实现安全高并发。

  • 高性能 Http Server:通过简单的代码调用就可以快速实现基于协程的 Web 服务[11],处理效率远高于 PHP。

  • 易部署:直接编译成机器码,除了 glibc 没有其他外部依赖。

  • 易学习:语言设计精简,25 个关键词表达能力强大;因为有 C 语言的基因,所以有 C 语言基础的开发者学习 Go 语言会非常轻松。

  • 工具链 & 库:完善的工具链(代码分析、依赖管理等)和出色的标准库大大优化了开发者学习和应用的体验。

Go 发布至今还未正式支持泛型,甚至曾有很多人认为 Go 语言或许永远不会加泛型,但其实关于泛型的推进工作一直在进行,从 2020 年的调研报告来看,泛型是使用 Go 语言的开发者最需要的特性 [12]

2020 年 Go 开发者调研报告:最需要但还缺少的特性

2021 年初 Ian Lance Taylor 正式发布了添加泛型的提案,不出意外会在下一个版本 Go 1.18 中实现。

# 社区 #

# 语言项目社区

Go 语言项目在 2009 年开源,项目的 Star 数已达到 9 万。根据 GitHub 提供的数据 [13],截止 2021 年 10 月 20 日共有 166 人提交了超过 5 万次代码,其中 Go 语言项目成员占比 28.9%,贡献占比 64.9%,Google 员工(非语言项目成员)占比 24.7%,贡献占比 17.83%,贡献趋势如下图:

Go 语言项目代码提交情况

从代码提交情况来看,大部分贡献来自 Google 内部,近三年来每年的提交人数稳定在 70~80 人。

参与社区提交 Issue 的用户数量也在持续增长,不过目前开启中的 Issue 仍有超过 7000 个,有近一半为“待调查分类”,可能为无效的 Issue。

Go 语言项目 Issue 创建情况

除了语言本身项目,语言的社区其实是更加广义的,使用 Go 语言的开发者有一个可爱的昵称 “Gopher”。

# “Gophers” 社区

在 GolangUK 2015 会议上,Damian Gryski 提到了 “Gophers” 的文化,这是开发者被 Go 吸引进而成为 “Gopher” 的原因 [14]。“Gophers” 的社区文化:

- Code- gofmt- if err != nil { ... }- go vet- go build -race- golint (CodeReviewComments)- godoc.org/github.com/user/package- go get- limited use of interface{}- Social- Simple is better than complex- Performance matters- Costs are visible

SlashData 在 2021 年初发布的开发者调研显示 Go 开发者人数已超过 200 万,社区人数排行第十 [15]

编程语言社区人数

在官方调研报告中,约半数开发者清楚了解如何给社区贡献,而感到自己的贡献是受欢迎的开发者比例约为 60%,这两个比例都在逐年提升 [12]。接受调研的开发者其实已经是相对活跃的,主观感受会导致调研结果有误差,但整体来看,仍有越来越多开发者愿意参与到社区贡献中。

Go 开发者调研报告 2020:社区满意度

活跃于社区的开发者通过邮件、媒体论坛、固定会议等交流 [16],有约 30% 开发者会频繁参与到开源项目中[12],但更多开发者并不会发出声音,他们在实践中使用 Go,也切实的从社区资源中获益。

  • 邮件列表:golang-nuts、golang-dev、golang-announce

  • 用户群和会议:GoBridge、GoDiscourse、GopherCon

  • 媒体论坛:The Go Forum、Gophers Slack Channel、Golang News、Twitter、Stack Overflow、Reddit 等

# 应用 #

GitHub 上 Go 为主要语言的开源项目已超过 10 万个,约 24 万开发者在这些开源项目中提交 PR [17]

GitHub 上每月新创建的 Go 语言项目数

官方调研报告显示,Go 应用最多的领域是 Web 开发,此外也被广泛应用于数据库、DevOps、网络编程和系统编程;在科学计算、手机等方面的应用较少 [12]

Go 开发者调研报告 2020:应用领域

这一点从开源项目中也可以了解到,2021 年截止 9 月最活跃的仓库(根据 PR 数量排序)基本上都与数据库、微服务平台和容器编排相关 [17]。Go 已成为云基础架构的语言,这绝不是偶然,最初 Go 的设计目的就是让 Google 工程师能更高效的编写“云端”软件。

2021 年 GitHub 活跃仓库(根据 PR 数量排序)Top 10

2013 年 Matt Stine 首次提出云原生(CloudNative)概念,2015 年云原生计算基金会(CNCF,Cloud Native Computing Foundation)成立,致力于发展推广云原生技术。CNCF 给云原生的定义中提到了目前的代表技术包括容器、服务网格、微服务、不可变基础架构和声明式 API 等 [18]

图片可上下滑动

云原生基础设施的很多代表性项目均为 Go 语言实现,这些技术的普及又带动了 Go 语言的推广,可以说 Go 语言和“云”是相互成就的。

  • 容器应用:Docker、Kubernetes

  • 数据库应用:etcd、TiDB

  • 微服务框架:Go Kit、Go Micro、Gizmo

  • Web 框架:Gin、Echo、Beego

国内如 PingCAP、腾讯、百度和京东等大公司均有 Go 语言的应用,2020 年 JetBrains 的开发者生态系统调研中,中国有 16% 的开发者在使用 Go 语言 [19]

Go 语言开发者地域分布

# 总结 #

回顾 Go 语言的发展情况,我们可以清楚地看到:

1. 针对开发痛点的语言特性:Go 从语言层面支持并行,部署简单,很好的解决了软件开发各维度规模化中出现的痛点。

2. 低学习曲线:可以快速上手并投入实际开发工作。

3. 开发者体验不断改善:开源社区运营,有完整的工具链、标准库和一些不错的开发框架。

4. “杀手级”应用:Docker、Kubernetes 出现,云计算技术不断完善普及,云原生概念兴起。

5. 巨头公司支持:大量国内外公司在使用 Go 语言开发,也会作为 Go 语言发展的支持后盾。

技术发展过程中,会顺应需求出现不同的开发工具或者说材料,Go 语言所有的特点都是为了实现更加高效的大规模开发而生,至少在云原生领域,Go 语言的地位已很难动摇。

扩展阅读

《Go语言设计与实现》会在今年年底正式出版,感兴趣的小伙伴可以看这里:《Go语言设计与实现》纸质书诚邀读者评论 (作者:Draveness)

参考

[1]

What is the history of the project? - golang.org https://golang.org/doc/faq#history

[2]

Go (programming language) - wikipedia https://en.wikipedia.org/wiki/Go_(programming_language)

[3]

https://www.unofficialgoogledatascience.com/2015/12/replacing-sawzall-case-study-in-domain.html

[4]

The Go Programming Language and Environment - UNSW Computing https://www.youtube.com/watch?v=YXV7sa4oM4I&t=1136s

[5]

Go at Google: Language Design in the Service of Software Engineering https://talks.golang.org/2012/splash.article

[6]

The State of Developer Ecosystem 2021: Go - JetBrains https://www.jetbrains.com/lp/devecosystem-2021/go/

[7]

Go: Retrospective https://medium.com/a-journey-with-go/go-retrospective-b9723352e9b0

[8]

Release History - golang.org https://golang.org/doc/devel/release

[9]

Go语言起源 - Go语言圣经(中文版) https://books.studygolang.com/gopl-zh/ch0/ch0-01.html

[10]

为什么要使用 Go 语言?Go 语言的优势在哪里?- 知乎 https://www.zhihu.com/question/21409296

[11]

大道至简—GO语言最佳实践 https://cloud.tencent.com/developer/article/1145176?fromSource=waitui

[12]

Go Developer Survey 2020 Results - golang.org https://go.dev/blog/survey2020-results

[13]

list commits - GitHub REST API https://docs.github.com/cn/rest/reference/repos#commits

[14]

The Go Community https://dgryski.medium.com/the-go-community-f0d00e3a19e

[15]

State of the Developer Nation 20th edition - SlashData

[16]

Wiki: The Go Community - GitHub https://github.com/golang/go/wiki#the-go-community

[17]

GH Archive https://www.gharchive.org/

[18]

cncf https://www.cncf.io/

[19]

Go 语言现状调查报告 - JetBrains https://blog.jetbrains.com/zh-hans/go/2021/02/19/the-state-of-go/

  • 从C转向Rust需要注意哪些问题?

  • 高并发场景下JVM调优实践之路

  • Apache APISIX 扩展指南

  • Pulsar与Rocketmq、Kafka、Inlong-TubeMQ,谁才是消息中间件的王者?

  • Go 语言网络库 getty 的那些事

技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。

高可用架构

改变互联网的构建方式

    推荐阅读
  • 抹茶红豆酥饼制作方法(抹茶红豆酥饼制作方法是什么)

    接下来我们就一起去研究一下吧!抹茶红豆酥饼制作方法把水油酥的材料放入面包机桶内揉面15分钟左右。油酥的材料混合均匀后揉成团。把水油酥和油酥面团盖上保鲜膜醒30分钟。油酥和水油酥各分成30个面团。擀成长舌状卷起,全部都做好。红豆馅分成25克一个,取一个酥饼皮用擀面杖擀开。放入豆沙馅,像包包子一样包好。收口朝下放置,稍稍压扁。烤箱160度预热好后,放入烤箱中层160度烤25分钟即可。

  • 一般油表亮了之后还可以跑多久(三秒知识点油表灯亮了)

    当油表灯亮起的时候,大多数新手司机都会怀着紧张的心情找加油站。但对于有经验的老司机来说,油表灯亮了其实不算什么事。有些更人性化的,还会标明大约还能行驶多少公里。以普通油耗标准来算,当油表灯亮后,汽车基本上还能再跑50~90公里左右。通常油表亮灯后,行驶20公里之内还是很安全的,超出这个范围就要小心行驶,最好提前准备好汽油。但是还是提醒各位小伙伴随时注意自己的油箱指示有备无患哦咱们下期见啦!

  • 梭子蟹死了怎么保存(梭子蟹死了的保存方法)

    以下内容希望对你有帮助!梭子蟹死了怎么保存刚死的梭子蟹最好的保存办法是洗净后蒸熟再冷冻。死的梭子蟹容易脱水,不蒸就直接冻的话,容易造成蟹肉失水,等到再解冻后,蟹壳会变得空空的,黄和膏也会变成液态流出,整个变成空壳,先蒸再冻的话可以有效的锁住水分。不过刚死的梭子蟹建议尽快食用。

  • 火龙果幼苗怎么施肥(火龙果幼苗如何施肥)

    火龙果幼苗怎么施肥给火龙果幼苗施肥的话,一定要选择好时机,原创通常是在扦插买苗出现发芽时才能施肥,这样可以让其快速爆出新芽来。可以为幼苗追施一点尿素肥,它能很好地促进火龙果小苗的生长,尤其对生根发芽非常有帮助。而且尿素肥的使用方法也非常简单,只不过火龙果小苗还很稚嫩、脆弱,一定要控制好浓度,确保肥液足够稀薄。一般取2克尿素肥,按照1000倍兑水稀释,充分溶解摇匀后浇在扦插基质里即可。

  • 电脑屏幕保护怎么取消(电脑屏幕保护取消方法)

    首先,在电脑中找到“计算机”;,现在小编就来说说关于电脑屏幕保护怎么取消?下面内容希望能帮助到你,我们来一起看看吧!在右边找到“更改屏幕保护程序”,选择打开;打开“更改屏幕保护程序”之后,找到“屏幕保护程序”,点击“屏幕保护程序”下面的下拉框;点击“屏幕保护程序”下面的下拉框之后,选择“无”;选择“无”之后,单击“确定”,保存修改;单击“确定”之后,我们已成功取消电脑屏幕保护。

  • 2000元左右手机(2022最值得买的手机推荐)

    搭载骁龙870这种次旗舰级别芯片的手机,价格跳水至1999元,一下子聚焦大量的关注。购买建议:在轻薄特性、外观颜值、屏幕和摄像方面,realmeX7Pro至尊版非常有竞争力。现在价格有所回落,更突显了它的性价比。优势:iQOONeo5SE搭载口碑不俗的高通骁龙870处理器,性能输出绝对很足的,玩起游戏来,不拖泥带水。购买建议:RedmiK40是2021年将旗舰性能拉开2000元价位“先锋”,不过压低价格,必定要阉割掉一些配置的。

  • 杨梅树什么时候开花结果(杨梅树开花结果的时间)

    下面内容希望能帮助到你,我们来一起看看吧!杨梅树什么时候开花结果杨梅4月开花,6-7月果实成熟。杨梅是杨梅科,杨梅属植物,常绿乔木,树皮黄灰黑色,叶倒披针形,先端钝。杨梅为雌雄异株,就是说雌树开雌性花,结果实;雄性树开雄性花,不结果。而且杨梅的花为葇荑花序。

  • 人之初性本善做人道理很现实(人心难猜又难看)

    上山猛虎易见真心,下水毒蛇不认六亲。社会没有遮天物,只有一物降一物。白酒红人面,黄金黑人心。心慈手软,只会让自己摔得更惨。一富遮千丑,一穷毁所有。日久不一定生情,但一定会见人心。世界上的所有事情都是暂时的,如果事事顺心,那就好好享受;如果发生意外,不要过于担心,一切都会过去的。接受自己的不完美,也接受别人的不完美。(图片来自于网络,若有侵犯了您的合法权益,请联系我们,我们将及时更正、删除。

  • 小暑种什么农作物(哪些农作物小暑种植呢)

    下面更多详细答案一起来看看吧!小暑种什么农作物小暑适合种的农作物有很多种,例如黄瓜,大白菜,生菜,菜花,胡萝卜等等。种下后要加强管理,及时浇水补水,满足对水分的需求。若是遇到连续的下雨天,要及时排出地块中的积水,避免抑制生长。此外,还要及时补充养分,养分足,环境适宜这样才可更好的生长,后期产量更高。

  • 韩信出装铭文以及思路和打法(第一代韩信的铭文出装现在还能用吗)

    接下来小编就给大家介绍一下韩信最古老的出装和铭文。蓝色10狩猎、绿色10鹰眼、红色10异变铭文上是用的百穿攻速铭文,异变、鹰眼和狩猎这也是韩信最初使用的铭文,高额的穿透能够让韩信在前期就拥有比较可观的输出,攻速和移速的加成也对韩信的刷野和Gank有很大的帮助。泣血之刃能提供续航能力,破军也能够提供一个高额的输出。