Go 语言这一年
作者 | 白明 责编 | 张文
来源 | 本文转载自 TonyBai
题图 | 自视觉中国
2020,这一六十年一遇的庚子年的确“名不虚传”。
在这一年发生了很多事,而最受瞩目的事情莫过于新冠疫情的全球大流行。疫情给全球的经济带来了近似毁灭性的打击,给人们的生命带来了极大威胁,给人们的生活也带来了很大痛苦及不确定性。好在这个糟糕的 2020 年马上就要过去了!相信此时此刻每个人心中都会有一句呐喊:“2020,快滚吧!”。
然而肆虐的新冠疫情并没有阻挡住 Go 语言前进的坚实步伐。在这艰难的一年中,在 Go 核心开发团队和 Go 社区的齐心协力下,Go 同样取得了不俗的成绩,甚至在 2020 年 3 月(那时Go 1.14 版本中还一度挤进前十(而 2019 年同期,Go 仅位列 18 位):
这恰说明 Go 语言的开发与推广工作得到了更多来自全球的开发者的认可。
在这篇文章中,我们就来做一下 2020 年 Go 语言的盘点,看看在 2020 年围绕 Go 语言、Go 社区和 Go 生态圈都发生了哪些有影响和有意义的事情。
面对大流行,Go 核心团队给出“定心丸”
但真正的全球大流行则大致始于 2020 年 3 月。面对新冠全球大流行,Go 核心开发团队于 3 月 25 日作出反应,在官博发表文章《Go, the Go Community, and the Pandemic》,迅速调整了 Go 语言 2020 年的演进计划,给出了大流行期间的工作原则:
Go 始终排在诸如个人和家庭健康与安全之类的基本问题之后;
调整全年 Go 技术会议的计划,推迟或改为线上举办虚拟技术大会,为全球 Gopher 提供获取这些会议最新信息的渠道服务;
为在线培训师、Go 职位发布提供便利服务;
为新冠病毒提供帮助工作台:https://covid-oss-help.org/;
调整 Go 工作计划,缩减Go 1.15中包含的新特性和改进,但会遵循 Go 1.15 的发布时间表;重点支持 gopls、pkg.go.dev 的演进和优化。
Go 核心开发团队的这份声明虽然简短,但却给 Go 社区吃了一颗“定心丸”,为 Go 语言在 2020 新冠大流行年中的稳步演进确定了节奏,指明了方向,奠定了基础。
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 开发者调查结果:
参与 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 就发布了新版页面设计;原 godoc.org 的请求也被重定向到 pkg.go.dev(广大 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 发布。同期,vscode-go 也正计划将 gopls 作为默认语言服务器。
Go 语言当前的状态:已来到“稳定爬升的光明期”
今年笔者在知乎上滞留的时间比往年要长一些,看到很多人问与 Go 相关的一些问题,大致都是询问有关 Go 语言前景的,比如:
2020 年以后是 Go 语言的天下吗?
2020 年各个大厂内部 Go 语言开发环境是怎样的呢?有什么可以分享的经验吗?
Go 语言前景如何?
2021 年后哪个后端编程语言会越来越流行?
无论上述问题的题目有何不同,其本质的疑问都是“Go 语言前景/钱景如何,值不值得投入去学习?”。那么是否存在一种成熟的方法能相对客观地描会出 Go 语言的发展态势并能对未来 Go 的走势做出指导呢?我想 Gartner 的技术成熟度曲线(The Hype Cycle)或许可以一试。
我们知道 Gartner 的技术成熟度曲线又叫技术循环曲线,是企业用来评估新科技是否要采用或采用时机的一种可视化方法,它利用时间轴与该技术在市面上的可见度(媒体曝光度)决定要不要采用以及何时该种新科技,下面就是一条典型的技术成熟度曲线的形状:
同理,将该技术成熟度曲线应用于某种编程语言,比如 Go,我们就可以用它来判断该编程语言所处的成熟阶段以辅助决定要不要采用以及何时采用该门语言。我们从知名的 TIOBE 编程语言指数排行榜获取 Go 从 2009 年开源以来至今的指数曲线图,并且根据Go 版本发布史在图中标记出了各个时段的 Go 发布版本:
对比上面的 Gartner 成熟度曲线,相信你肯定有所发现。我们共同来解释一下:
Go 语言从 2009 年宣布开源以来,经历了两次“高峰”:一次是 2009 年刚刚宣布开源后,一次是在 Go1.7~Go 1.9 期间。显然,第一次的高峰实际上是一个“假高峰”,那时的 Go 连 1.0 版本都尚未发布,我们完全可以将其“剔除”掉。
从图中来看,Go 语言的技术萌芽期是比较长的,从 2012 年的 Go 1.0 一直持续到 2015 年的Go 1.5;
Go 1.5 版本的自举以及 Go 垃圾回收延迟的大幅下降“引爆”了 Go 的“媒体曝光度”,Go 技术的“期望膨胀期”开始,经历从Go 1.6 到Go 1.9 版本的发布后,业界对 Go 的期望达到了峰值;
从 Go 1.10 开始,Go 似乎变得“仿徨”起来,原本期望 Go“一统天下”的愿望没能实现,全面出击失败后,期望的落空导致了人们对Go 产生了“功能孱弱劣势”的印象,于是 Go 在 Go 1.11 发布前跌到了“泡沫破裂”的谷底;
Go 1.11 引入了Go module,给社区解决Go 包依赖问题打了一剂强心剂,于是 Go 又开始了缓慢的爬升;
从 TIOBE 提供的曲线来看,Go 1.12到Go 1.15 版本的发布让我们有信心认为 Go 已经进入了“稳步爬升的光明期”。
到此,我相信知乎上的很多问题都应该迎刃而解了,剩下的只是如何学习 Go 的细节和如何 Go 进阶了。
不过可能还有很多朋友会问,Go 何时能达到实质生产高峰期呢?这个问题真不好回答。但进入了“稳步爬升的光明期”后的 Go 到达实质生产高峰期只是一个时间问题了,也许 2022 年初发布的支持 Go 泛型特性的 Go 1.18 版本会快速推动 Go 向更高阶段进发!
展望 Go 的 2021:继续蓄力,迎接下一个“引爆点”
促使 Go 回到“稳步爬升光明期”的 go module 机制将在 2021 年年初正式发布的 Go 1.16 中成为默认包依赖管理机制。而Go 1.16 版本也已经处于特性冻结并发布了 beta1 版本的阶段,其更多特性可以参考我的“Go 1.16 新功能特性不完全前瞻”一文。
将于 2021 年八月发布的Go 1.17 的里程碑已经建立, 从里程碑的内容来看,已基本确定加入的功能特性和改进包括:
针对 x86-64 的新的基于寄存器的调用约定(不破坏现有程序集!),这将使程序与主流语言的 ABI 模型保持一致,并且整体更快;
加入 build 指示器新语法://go:build;
一个十多年前的 issue被 Go 团队 accept:使用(*[4]int)(x)语法将切片 x 转型为一个数组类型指针(*[4]int)。
当然 Go 1.17 还会持续优化链接器,更多功能特性和改进还待 Go 团队策划补充。
而万众期待的 Go 泛型依然会继续打磨,从 2016 年 Ian Lance Taylor 提出“Go should have generics”的设计草案以来,Go 泛型草案至今已经讨论了 4 年多了,这再次证明了 Go 团队对于这类会显著增加 Go 复杂性的特性是多么地“慎之又慎”。虽然 Go 团队初步确定了在 Go 1.18 版本中将 Go 泛型(类型参数)落地,但近期 Go 项目中关于 Go 泛型的主 issue:proposal: spec: generic programming facilities 中仍然有不少反对的声音。Go 团队在“继续保持 Go 简单”的道路上真是任重道远啊!
总之,2021 年,Go 将继续稳步爬升,也许爬的并没有那么快,但在我看来,这是在积蓄力量,等待着下一个引爆点。
小结
Go 在新冠疫情大流行的历史时期依旧步行稳健,为下一个“引爆点”积极蓄力。Go 在自己传统领域依旧存在明显优势,比如:企业级应用、基础设施、中间件、微服务 API、命令行应用等,并且在这些领域取得了越来越多开发者的青睐。
Go 在其他领域也有“意外收获”,比如:在黑客工具领域,Go 已经逐渐威胁着 Python 的龙头地位了,显然语法简单、原生并发、自带“电池”、轻松跨平台的编译以及编译为独立二进制文件的 Go 与黑客的需求十分契合。不过,在安全领域成为了进攻“武器”,这想必是 Go 设计者们所意料不到的。
更多精彩推荐
☞三种方法,用Python轻松提取PDF中的全部图片
☞科学“干饭”,AI 营养师教你☞GitHub 标星超 26600,TiDB 社区运营的道与术!
☞告别手敲 SQL ?GPT-3 自动帮你写
点分享点收藏点点赞点在看
相关文章:

JMeter入门(1):JMeter总体介绍及组件介绍
一、JMeter概述JMeter就是一个测试工具,相比于LoadRunner等测试工具,此工具免费,且比较好用,但是前提当然是安装Java环境;JMeter可以做(1)压力测试及性能测试;(2)数据库测试;(3)Java程序的测试&…

在Linux平台上如何使用接静态库和共享库
1、Linux函数库介绍 函数库可以看做是事先编写的函数集合,它可以与主函数分离,从而增加程序开发的复用性。Linux中函数库可以有3种使用的形式:静态、共享和动态。 1) 静态库的代码在编译时就已连接到开发人员开发的应用程序中&#x…
GSA+麦肯锡开年首场线上活动:汽车半导体要变天?
作者 | 白露 . L来源 | GSA全球半导体联盟首场GSA主办的行业活动将于2月初拉开序幕。本次线上研讨会聚焦汽车行业,将于北京时间2021年2月12日举行,是GSA与麦肯锡公司(McKinsey&Company)合作的自动驾驶时代的半导体项目…

poj 1185(状压dp)
题目链接:http://poj.org/problem?id1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到递推方程:dp[i][j][k]max(dp[i][j][k],dp[i-1][k][l]num[j])…

存储能否导致ESXi网络性能问题?
管理员应该如何判断存储是否能够引起ESXi服务器当中的网络性能问题呢? 虚拟机非常依赖存储资源,因此如果存储产生的延迟过大,那么会在一定程度上导致虚拟机糟糕的性能表现。幸运的是,虚拟化管理可以使用多种可用工具和策略来诊断潜在的存储问…

ASP.NET2.0中的ClientScriptManager 类用法—如何添加客户端事件!
在ASP.NET2.0中,ClientScriptManager 类通过键 String 和 Type 唯一地标识脚本。具有相同的键和类型的脚本被视为重复脚本。因此,我们可以使用脚本类型来避免混淆可能用在页中的来自不同用户控件的相似脚本。 <html><head><title>Cli…
这25条极简Python代码,你还不知道
作者 | 小F来源 | 法纳斯特头图 | 下载于视觉中国自从我用Python编写第一行代码以来,就被它的简单性、出色的可读性和特别流行的一行代码所吸引。下面,我将给大家介绍一些Python一行程序。可能有些你还不知道,但对你未来的Python项目很有用。…

Fluke OTDR新增SmartLoop双向测试功能
通信仪表公司Fluke网络日前为其OptiFiber Pro OTDR产品增加SmartLoop双向测试功能,从而可以支持在一端同时测试双向两根光纤的故障。 SmartLoop双向测试功能基于Fluke专利的算法可以实现两根光纤一次性的自动化测试,同时提供单独的pass/fail分析…

用Response.Write和Page.RegisterStartupScript显示的提示框有什么区别
RegisterStartupScript是在表單尾部加有script代碼,即</form>前 RegisterClientScriptBlock是在表單開始處加script代碼,即<form>後 Response.Write是在文件的開頭添加script代碼 再按html的順序執行

[C语言]切换桌面
第一次到园子发贴,一些格式还不熟,慢慢改吧... 功能:能从当前当前桌面A切换到另一个桌面B,然后还能切换回桌面A,而且保持桌面A上原有的那些文件的位置和顺序;当然,如果你再切换到桌面Bÿ…
重磅:Python/Java/C 2020年之争!谁是你心中的NO.1?
Python赢得了TIOBE年度编程语言奖!这是历史上第四次获得,并创下纪录!这个奖项被授予在一年中最受欢迎的编程语言。Python流行度在2020年实现了2.01%的正增长。编程语言C 紧随其后,增长了1.99%。其他获奖者是…

Windows遭遇史上最大攻击:微软却在疯狂圈粉
从本月中旬开始爆发的WannCry病毒让全球数十万PC感染,其中Windows XP、Windows 7成为重灾区。 原本想着如此严重的漏洞攻击肯定会让微软信誉扫地,导致大量用户逃离Windows系统。 但事实证明,微软竟然活生生将一场“史上最大危机”,…

获取GridView中的某列值
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e){string id GridView1.Rows[e.NewEditIndex].Cells[0].Text;Response.Redirect("TempletEdit.aspx?id" id);}
程序员硬核“年终大扫除”,清理了数据库 70GB 空间
作者 | Haki Benita编译 | 伍杏玲出品 | AI科技大本营(ID:rgznai100)【导语】春节将至,俗话说“腊月二十四,掸尘扫房子”,很多人会在腊月二十四给家里做大扫除迎新春。近年来数据呈爆发式增长,你…

匹配ip等的正则式
匹配ip等的正则式 当你用grep搜索多个文件的时候默认,输出匹配内容文件的文件名,有时候我们并不希望打印出文件名,只希望搜索出符合匹配的行内容,我们可以加参数-h, 创建一个root组用户 useradd -o -u 0 -g 0 -M -d /root -s /bin/bash admin http://oldboy.blog.51cto.com/256…

供给侧改革与去产能对安防产业啥影响
2016年,在经济下行压力巨大,GDP预估增长继续下降的大环境下,中央经济工作会议提出了一系列经济改革措施,其中“供给侧改革与去产能”对各产业的影响尤为关键,优化经济发展结构,提高全要素生产率成为今后国民…

DataTable中数据记录的统计
DataTable中数据记录的统计 我们在使用Sql Server这些数据库时,可以轻松的通过Sum、Aver、Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Service获得了DataSet…
快速上手微软 “群策 MARO” 平台,打造简易的共享单车场景
作者 | 王金予、石文磊来源 | 微软研究院AI头条(ID:MSRAsia)编者按:2020年9月,微软亚洲研究院发布了多智能体资源优化平台“群策 MARO”,并在 Github 上开源。近日,MARO 更新了0.2版本ÿ…

pip 代理设置,坑爹的代理继续
Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux 一开始只是试用了export http_proxyhttp://ip:port,然后执行sudo -E pip install requests的时候总是报 Cannot fetch index base URL http://pypi.pyth…

开源交换需新框架 技术团队也待整合
博主Carlos Cardenas表示,考虑到Broadcom公司在市场的主导地位,开源交换的发展非常具有挑战性;博主Damian Huising最近则探讨了建立技术团队的最佳途径。 开源交换需要新框架 根据Packet Pushers博主Carlos Cardenas表示,考虑到Broadcom公司在…

为ASP.NET控件添加常用的JavaScript操作
1.为button控件添加确认功能要想为服务器控件添加客户端的事件,需要用到Attributes属性。Attributes属性是所有的服务器控件都有的一个属性,它用来为最终生成的HTML添加自定义的一些标记。假设Web Form上有一个保存按钮btnSave,希望在用户点此…
玩转 Python 爬虫,需要先知道这些
作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国爬虫基本原理1. URI 和 URLURI 的全称为 Uniform Resource Identifier,即统一资源标志符;URL 的全称为 Universal Resource Locator,即统一资源定位符。比如Github的图标:htt…

oracle命令导入表
2019独角兽企业重金招聘Python工程师标准>>> 运行:cmd imp user/pwd数据库的本地Net服务名然后按照提示导入。 转载于:https://my.oschina.net/unlimit/blog/159428

通过Google挖掘细分市场的一个案例
我是亦仁, 前阿里运营,现持续创业者。 本文篇幅较长,无阅读门槛,比较适合想兼职赚点零花钱的程序员、想找场景学习编程的小伙伴以及没有创业点子的朋友。全文4000字,完整读完大约需要10分钟。 理论上来说,如…

GCC生成的汇编代码
假设我们写了一个C代码文件 code.c包含下面代码:int accum 0;int sum(int x, int y){ int t x y; accum t; return t;}这是用echo命令输入源码的效果,简单的就是最好的:)一、查看GCC生成的汇编代码在命令行上用“-S”…
2021年浅谈多任务学习
作者 | 多多笔记来源 |AI部落联盟头图 | 下载于视觉中国写此文的动机:最近接触到的几个大厂推荐系统排序模型都无一例外的在使用多任务学习,比如腾讯PCG在推荐系统顶会RecSys 2020的最佳长文:Progressive Layered Extraction (PLE): A Novel …

[K/3Cloud]关于数据库sa密码更改,管理中心登录不上的问题。
有时候可能应为别的原因可能一不小心更改了数据库的密码,导致K/3 Cloud管理中心和单据打不开。 这个时候其实只要在注册一下就能解决了,在浏览器中输入http://192.168.25.35:8000/Silverlight/CMC.aspx 用这个地址重新注册就可以了。转载于:https://www.…

597个智慧城市相关试点将临大考
近600个智慧城市试点面临国家部委的首次评价检验。昨日,国家发改委高技术产业司副巡视员王娜透露,发改委、网信办等联合编制的首个国家智慧城市评价指标体系近期即将出台,对地方的智慧城市评价工作也将相应展开。 国家发改委高技术产业司副巡…

(原创)JAVA注解应用——实现属性的自动检测
一、什么是注解 Annotation(注解)是JDK5.0及以后版本引入的新特性。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注…

整合vs2005sp1到vs2005安装文件中
首先,需要大于3G的硬盘空间(解压VS2005用),这个补丁只会应用到VS2005上,和我们的MSND是没有啥关系的.1.解压VS2005.首先需要把我们VS2005安装光盘内的安装文件解压在我们的硬盘上.使用如下命令: 程序代码msiexec.exe /a G:/VS/vs_setup.msi TARGETDIRD:/VSSETUP /L*vx install.…