2020年Go语言盘点:新冠大流行阻挡不了Go演进的步伐

2023-10-29 22:30

本文主要是介绍2020年Go语言盘点:新冠大流行阻挡不了Go演进的步伐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


2020,这一六十年一遇的庚子年的确“名不虚传”。在这一年发生了很多事,而最受瞩目的事情莫过于新冠疫情的全球大流行。疫情给全球的经济带来了近似毁灭性的打击,给人们的生命带来了极大威胁,给人们的生活也带来了很大痛苦及不确定性。好在这个糟糕的 2020 年马上就要过去了!相信此时此刻每个人心中都会有一句呐喊:“2020,快滚吧!”。

然而肆虐的新冠疫情并没有阻挡住 Go 语言前进的坚实步伐。在这艰难的一年中,在 Go 核心开发团队和 Go 社区的齐心协力下,Go 同样取得了不俗的成绩,甚至在 2020 年 3 月(那时Go 1.14 版本[1]中还一度挤进前十[2](而 2019 年同期,Go 仅位列 18 位):


这恰说明 Go 语言的开发与推广工作得到了更多来自全球的开发者的认可。在这篇文章中,我们就来做一下 2020 年 Go 语言的盘点,看看在 2020 年围绕 Go 语言、Go 社区和 Go 生态圈都发生了哪些有影响和有意义的事情。

1. 面对大流行,Go 核心团队给出“定心丸”

大流行始于 2020 年 1 月的武汉,但真正的全球大流行则大致始于 2020 年 3 月。面对新冠全球大流行,Go 核心开发团队于 3 月 25 日作出反应,在官博发表文章《Go, the Go Community, and the Pandemic》[3],迅速调整了 Go 语言 2020 年的演进计划,给出了大流行期间的工作原则:

  • Go 始终排在诸如个人和家庭健康与安全之类的基本问题之后;

  • 调整全年 Go 技术会议的计划,推迟或改为线上举办虚拟技术大会,为全球 Gopher 提供获取这些会议最新信息的渠道服务;

  • 为在线培训师、Go 职位发布提供便利服务;

  • 为新冠病毒提供帮助工作台[4]:https://covid-oss-help.org/;

  • 调整 Go 工作计划,缩减Go 1.15中包含的新特性和改进,但会遵循 Go 1.15 的发布时间表;重点支持 gopls、pkg.go.dev 的演进和优化。

Go 核心开发团队的这份声明虽然简短,但却给 Go 社区吃了一颗“定心丸”,为 Go 语言在 2020 新冠大流行年中的稳步演进确定了节奏,指明了方向,奠定了基础。

2. Go 在 2020 年值得关注的那些变化

2020 一年,Go 核心开发团队、社区和生态圈做了很多工作,但这里无法一一枚举,仅挑出一些重要的变化列在这里:

  • 2020 年 2 月 26 日,Go 1.14 版本发布。主要的变动点包括:

    • 嵌入接口的方法集可重叠;

    • 基于系统信号机制实现了异步抢占式的 goroutine 调度;

    • defer 性能得以继续优化,理论上有 30%的性能提升;

    • go module 已经生产就绪,并支持 subversion 源码仓库;

    • 重新实现了运行时的 timer;

    • testing 包的 T 和 B 类型都增加了自己的Cleanup方法。

  • 2020 年 4 月 20 日,发布2019 年 Go 开发者调查结果[5]

    • 参与 2019 开发者调查的 gopher 数量几乎为 2018 年的 2 倍,达到 10,975 人;

    • 大多数受访者每天都在使用 Go,而且这个数字每年都有上升的趋势;

    • Go 的使用仍然集中在科技公司,但 Go 越来越多地出现在更广泛的行业中,如金融和媒体;

    • 调查的大部分指标的同比值都很稳定;

    • 受访者正在使用 Go 来解决类似的问题,特别是构建 API/RPC 服务和 CLI,和他们工作的组织规模大小关系不大;

    • 大多数团队试图快速更新到最新的 Go 版本;当第三方供应商迟迟不支持当前的 Go 版本时,就会给开发者造成采用障碍;

    • 现在 Go 生态系统中几乎所有人都在使用go module,但围绕包管理的一些混乱仍然存在;

    • 需要改进的高优先级领域包括调试、go module 使用以及与云服务交互的体验改善;

    • VS Code 和 GoLand 的使用量持续增加;现在每 4 个受访者中就有 3 个首选它们。

  • 2020 年 6 月,vscode-go 扩展(vscode 上的 go 标准插件)将主代码库从 github.com/microsoft/vscode-go 迁移到 github.com/golang/vscode-go,成为 Go 官方项目的一部分。

  • 同在 2020 年 6 月,pkg.go.dev 网站开源!该网站是 Go 团队在 Go 社区建设方面做出的主要工作,开源后的 pkg.go.dev 将接收更多来自社区的想法和改进意见,比如:11 月,pkg.go.dev 就发布了新版页面设计[6];原 godoc.org 的请求也被重定向到 pkg.go.dev[7](广大 gopher 可能需要一段时间来适应这种改变)。

  • 2020 年 8 月,Go 1.15 版本发布,其主要的变动点包括:

    • GOPROXY 新增以管道符为分隔符的代理列表值;

    • module cache 的存储路径可设置;

    • 改善派生自原生类型的自定义类型变量在 panic 时的输出形式;

    • 将小整数([0,255])转换为 interface 类型值时将不会额外分配内存;

    • 加入更现代化的链接器(linker),新链接器的性能要提高 20%,内存占用减少 30%;

    • 增加 tzdata 包。

  • 2020 年 11 月初,全球最具影响力的 Go 语言技术大会GopherCon 2020[8]在线上举行!Austin Clements 详细讲解了 Go 1.14 加入的基于系统信号的抢占式调度器;Go 语言之父之一的 Robert Griesemer 讲解了Go 泛型当前的状态以及未来的计划。会后 Russ Cox 确认了 Go 团队将在 Go 1.18 版本中加入 Go 泛型(类型参数)作为试验特性;

  • 2020 年 11 月 10 日,Russ Cox 代表 Go 核心开发团队发文庆祝Go 语言发布 11 周年,在文中他回顾了 Go 这一年来的收获以及对 2021 年Go 1.16和 Go 1.17 的展望。文中他还提到了 GOPATH 的历史使命即将结束,Go 将开启全面 module-aware 模式的 Go 工具链时代!(下图来自推特):


  • 2020 年 12 月中旬,Go 1.16beta1 发布。在Go 1.16中,Go 将原生提供对 Apple M1 芯片(darwin/arm64)的支持;同时,在 Go 1.16 中 go module 将成为默认包依赖管理机制;Go 1.16 还提供了支持在 Go 二进制文件中嵌入静态文件的官方原生方案,支持对 init 函数的执行时间和内存消耗的跟踪,链接器性能得到进一步优化等。

  • 2020 年 12 月 16 日,gopls v0.6.0[9]发布。同期,vscode-go 也正计划将 gopls 作为默认语言服务器[10]

3. Go 语言当前的状态:已来到“稳定爬升的光明期”

今年笔者在知乎上滞留的时间比往年要长一些,看到很多人问与 Go 相关的一些问题,大致都是询问有关 Go 语言前景的,比如:

  • 2020 年以后是 Go 语言的天下吗?[11]

  • 2020 年各个大厂内部 Go 语言开发环境是怎样的呢?有什么可以分享的经验吗?[12]

  • Go 语言前景如何?[13]

  • 2021 年后哪个后端编程语言会越来越流行?[14]

无论上述问题的题目有何不同,其本质的疑问都是“Go 语言前景/钱景如何,值不值得投入去学习?”。那么是否存在一种成熟的方法能相对客观地描会出 Go 语言的发展态势并能对未来 Go 的走势做出指导呢?我想 Gartner 的技术成熟度曲线(The Hype Cycle)[15]或许可以一试。

我们知道 Gartner 的技术成熟度曲线又叫技术循环曲线,是企业用来评估新科技是否要采用或采用时机的一种可视化方法,它利用时间轴与该技术在市面上的可见度(媒体曝光度)决定要不要采用以及何时该种新科技,下面就是一条典型的技术成熟度曲线的形状:


同理,将该技术成熟度曲线应用于某种编程语言,比如 Go,我们就可以用它来判断该编程语言所处的成熟阶段以辅助决定要不要采用以及何时采用该门语言。我们从知名的TIOBE 编程语言指数排行榜获取 Go 从 2009 年开源以来至今的指数曲线图[16],并且根据Go 版本发布史[17]在图中标记出了各个时段的 Go 发布版本:


对比上面的 Gartner 成熟度曲线,相信你肯定有所发现。我们共同来解释一下:

  • Go 语言从 2009 年宣布开源以来,经历了两次“高峰”:一次是 2009 年刚刚宣布开源后,一次是在 Go1.7~Go 1.9 期间。显然,第一次的高峰实际上是一个“假高峰”,那时的 Go 连 1.0 版本都尚未发布,我们完全可以将其“剔除”掉。

  • 从图中来看,Go 语言的技术萌芽期是比较长的,从 2012 年的 Go 1.0 一直持续到 2015 年的Go 1.5[18]

  • Go 1.5 版本[19]的自举以及 Go 垃圾回收延迟的大幅下降“引爆”了 Go 的“媒体曝光度”,Go 技术的“期望膨胀期”开始,经历从Go 1.6[20]到Go 1.9 版本[21]的发布后,业界对 Go 的期望达到了峰值;

  • 从 Go 1.10 开始,Go 似乎变得“仿徨”起来,原本期望 Go“一统天下”的愿望没能实现,全面出击失败后,期望的落空导致了人们对Go 产生了“功能孱弱劣势”的印象,于是 Go 在 Go 1.11 发布前跌到了“泡沫破裂”的谷底;

  • Go 1.11[22]引入了Go module[23],给社区解决Go 包依赖问题[24]打了一剂强心剂,于是 Go 又开始了缓慢的爬升;

  • 从 TIOBE 提供的曲线来看,Go 1.12[25]到Go 1.15 版本的发布让我们有信心认为 Go 已经进入了“稳步爬升的光明期”。

到此,我相信知乎上的很多问题都应该迎刃而解了,剩下的只是如何学习 Go 的细节和如何 Go 进阶了。

不过可能还有很多朋友会问,Go 何时能达到实质生产高峰期呢?这个问题真不好回答。但进入了“稳步爬升的光明期”后的 Go 到达实质生产高峰期只是一个时间问题了,也许 2022 年初发布的支持 Go 泛型特性的 Go 1.18 版本会快速推动 Go 向更高阶段进发!

4. 展望 Go 的 2021:继续蓄力,迎接下一个“引爆点”

促使 Go 回到“稳步爬升光明期”的 go module 机制将在 2021 年年初正式发布的 Go 1.16 中成为默认包依赖管理机制。而Go 1.16 版本[26]也已经处于特性冻结并发布了 beta1 版本的阶段,其更多特性可以参考我的“Go 1.16 新功能特性不完全前瞻”一文。

将于 2021 年八月发布的Go 1.17 的里程碑[27]已经建立, 从里程碑的内容来看,已基本确定加入的功能特性和改进包括:

  • 针对 x86-64 的新的基于寄存器的调用约定[28](不破坏现有程序集!),这将使程序与主流语言的 ABI 模型保持一致,并且整体更快;

  • 加入 build 指示器新语法[29]//go:build

  • 一个十多年前的 issue[30]被 Go 团队 accept:使用(*[4]int)(x)语法将切片 x 转型为一个数组类型指针(*[4]int)。

当然 Go 1.17 还会持续优化链接器,更多功能特性和改进还待 Go 团队策划补充。

而万众期待的 Go 泛型依然会继续打磨,从 2016 年 Ian Lance Taylor 提出“Go should have generics”[31]的设计草案以来,Go 泛型草案至今已经讨论了 4 年多了,这再次证明了 Go 团队对于这类会显著增加 Go 复杂性的特性是多么地“慎之又慎”。虽然 Go 团队初步确定了在 Go 1.18 版本中将 Go 泛型(类型参数)落地,但近期 Go 项目中关于 Go 泛型的主 issue:proposal: spec: generic programming facilities[32]中仍然有不少反对的声音。Go 团队在“继续保持 Go 简单”的道路上真是任重道远啊!

总之,2021 年,Go 将继续稳步爬升,也许爬的并没有那么快,但在我看来,这是在积蓄力量,等待着下一个引爆点。

5. 小结

Go 在新冠疫情大流行的历史时期依旧步行稳健,为下一个“引爆点”积极蓄力。Go 在自己传统领域依旧存在明显优势,比如:企业级应用、基础设施、中间件、微服务 API、命令行应用等,并且在这些领域取得了越来越多开发者的青睐。

Go 在其他领域也有“意外收获”,比如:在黑客工具领域,Go 已经逐渐威胁着 Python 的龙头地位了[33],显然语法简单[34]、原生并发[35]、自带“电池”[36]、轻松跨平台的编译以及编译为独立二进制文件的 Go 与黑客的需求十分契合。不过,在安全领域成为了进攻“武器”,这想必是 Go 设计者们所意料不到的。

6. 福利!2020 年本博客最受欢迎 Go 相关文章 TOP10

  • Go 新泛型设计方案详解

  • Go 语言有哪些“劣势”

  • Go,11 周年

  • Go 1.16 新功能特性不完全前瞻

  • Go 1.14 中值得关注的几个变化

  • Go 1.15 中值得关注的几个变化

  • 像跟踪分布式服务调用那样跟踪 Go 函数调用链

  • 系统学习 Go 语言,有这几本书就够了

  • 通过实例深入理解 sync.Map 的工作原理

  • Go 专栏“改善 Go 语言编程质量的 50 个有效实践”上线了


Gopher 部落知识星球已正式转正了!高品质首发 Go 技术文章,“三天”首发阅读权,每年两期 Go 语言发展现状分析,每天提前 1 小时阅读到新鲜的 Gopher 日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于 Go 语言生态的所有需求!星球首开,福利自然是少不了的!离2020 年年底还剩最后两天了,8.8 折加入星球,下方图片扫起来吧,先到先得哦!

Go 技术专栏“改善 Go 语⾔编程质量的 50 个有效实践[37]”正在慕课网火热热销中!本专栏主要满足广大 gopher 关于 Go 语言进阶的需求,围绕如何写出地道且高质量 Go 代码给出 50 条有效实践建议,上线后收到一致好评!欢迎大家订阅!

我的网课“Kubernetes 实战:高可用集群搭建、配置、运维与应用[38]”在慕课网热卖中,欢迎小伙伴们订阅学习!

Gopher Daily(Gopher 每日新闻)归档仓库 - https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博:https://weibo.com/bigwhite20xx

  • 微信公众号:iamtonybai

  • 博客:tonybai.com

  • github: https://github.com/bigwhite

  • “Gopher 部落”知识星球:https://public.zsxq.com/groups/51284458844544

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

参考资料

[1] 

Go 1.14版本: https://mp.weixin.qq.com/s/PVxdtvSXgNpiD65TUo-TCg

[2] 

挤进前十: https://my.oschina.net/u/4593547/blog/4453355

[3] 

《Go, the Go Community, and the Pandemic》: https://blog.golang.org/pandemic

[4] 

帮助工作台: https://covid-oss-help.org/

[5] 

2019年Go开发者调查结果: https://blog.golang.org/survey2019-results

[6] 

pkg.go.dev就发布了新版页面设计: https://blog.golang.org/pkgsite-redesign

[7] 

原godoc.org的请求也被重定向到pkg.go.dev: https://blog.golang.org/godoc.org-redirect

[8] 

GopherCon 2020: https://www.gophercon.com/

[9] 

v0.6.0: https://github.com/golang/tools/releases/tag/gopls%2Fv0.6.0

[10] 

计划将gopls作为默认语言服务器: https://github.com/golang/vscode-go/issues/1037

[11] 

2020年以后是Go语言的天下吗?: https://www.zhihu.com/question/379439622/answer/1618633268

[12] 

2020年各个大厂内部Go语言开发环境是怎样的呢?有什么可以分享的经验吗?: https://www.zhihu.com/question/386183447/answer/1575697918

[13] 

Go语言前景如何?: https://www.zhihu.com/question/431762724/answer/1593984796

[14] 

2021年后哪个后端编程语言会越来越流行?: https://www.zhihu.com/question/435974651/answer/1648652343

[15] 

技术成熟度曲线(The Hype Cycle)https://www.gartner.com/en/research/methodologies/gartner-hype-cycle

[16] 

TIOBE编程语言指数排行榜获取Go从2009年开源以来至今的指数曲线图: https://www.tiobe.com/tiobe-index/go/

[17] 

Go版本发布史: https://tip.golang.org/doc/devel/release.html

[18] 

Go 1.5: https://tonybai.com/2015/07/10/some-changes-in-go-1-5/

[19] 

Go 1.5版本: https://tonybai.com/2015/07/10/some-changes-in-go-1-5/

[20] 

Go 1.6: https://tonybai.com/2016/02/21/some-changes-in-go-1-6/

[21] 

Go 1.9版本: https://tonybai.com/2017/07/14/some-changes-in-go-1-9/

[22] 

Go 1.11: https://tonybai.com/2018/11/19/some-changes-in-go-1-11

[23] 

Go module: https://tonybai.com/2019/06/03/the-practice-of-upgrading-major-version-under-go-module/

[24] 

Go包依赖问题: https://tonybai.com/2019/09/21/brief-history-of-go-package-management

[25] 

Go 1.12: https://tonybai.com/2019/03/02/some-changes-in-go-1-12

[26] 

Go 1.16版本: https://github.com/golang/go/milestone/145

[27] 

Go 1.17的里程碑: https://github.com/golang/go/milestone/163

[28] 

基于寄存器的调用约定: https://github.com/golang/go/issues/40724

[29] 

加入build指示器新语法: https://github.com/golang/go/issues/41184

[30] 

一个十多年前的issue: https://github.com/golang/go/issues/395

[31] 

“Go should have generics”: https://github.com/golang/proposal/blob/master/design/15292-generics.md

[32] 

主issue:proposal: spec: generic programming facilities: https://github.com/golang/go/issues/15292

[33] 

在黑客工具领域,Go已经逐渐威胁着Python的龙头地位了: https://www.imperva.com/blog/python-and-go-top-the-chart-of-2019s-most-popular-hacking-tools/

[34] 

语法简单: https://www.imooc.com/read/87/article/2321

[35] 

原生并发: https://www.imooc.com/read/87/article/2340

[36] 

自带“电池”: https://www.imooc.com/read/87/article/2341

[37] 

改善Go语⾔编程质量的50个有效实践: https://www.imooc.com/read/87

[38] 

Kubernetes实战:高可用集群搭建、配置、运维与应用: https://coding.imooc.com/class/284.html

这篇关于2020年Go语言盘点:新冠大流行阻挡不了Go演进的步伐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303767

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的