2022年Go语言盘点:泛型落地,无趣很好,稳定为王

本文永久链接 – https://tonybai.com/2022/12/29/the-2022-review-of-go-programming-language

早早就计划好在年前写一个Go语言年度盘点,就像2020年2021年那样。但恰逢国内疫情管控放开,一波阳了之后身体十分容易疲劳,再加上工作上的事情挺多,这篇盘点也就迟迟没能下笔。

今年的盘点思路将围绕三个关键字来展开:泛型、无趣(boring)和稳定。下面我们逐一来看看。

1. “泛型”靴子落地

2022年3月中旬,Go社区尤其是那些期盼Go加入泛型特性的Gopher终于迎来了Go 1.18版本的正式发布,这意味着Go泛型这只靴子终于落地了

其实,从Go开源那一天开始,Go核心团队就没有间断过对泛型的探索,并一直尝试寻找一个理想的泛型设计方案,但始终未能如愿。直到近几年Go团队觉得Go已经逐渐成熟,是时候下决心解决Go社区主要关注的几个问题了,包括泛型、包依赖以及错误处理等。其中泛型常年在Go官方用户调查报告的“你最想要的Go语言特性”这项调查的榜单上霸榜,下图摘自2020年度Go官方用户调查结果:

之后,Go团队安排伊恩·泰勒和罗伯特·格瑞史莫花费更多精力在泛型的设计方案上,这才有了Go 1.18 版本中泛型语法特性的落地。

个人觉得:Go泛型是Go核心团队对Go社区的一次迎合与妥协,因为泛型与Go的主要设计哲学“简单”是有悖的。泛型这个语法特性会给语言带来复杂性,这种复杂性不仅体现在语法层面上引入了难于理解和使用的新的语法元素,也体现在类型系统和运行时层面上为支持泛型进行的复杂的实现。

如果从2010年6月份,伊恩·泰勒提出的Type Functions设计方案算起,到2022年3月份的泛型落地,Go加入泛型之路足足走了近12年。不过结果还是不错的,经过近12年的努力与不断地自我否定,Go团队终于找到了一个不违背Go1兼容性承诺(见下图)泛型实现方案

从这方面讲,Go对泛型的支持又是十分成功的。在如此语法巨变的情况下,依然保持向后兼容(backforward compatibility)。

不过如果你因为Go加入了对泛型的支持就打算投入Go阵营,这里先给你一些友情提示:和支持泛型的主流编程语言之间的泛型设计与实现存在差异一样,Go的泛型与其他主流编程语言的泛型也是不同的。在学习Go泛型之前,可以先了解一下Go泛型设计方案已经明确不支持的若干特性,比如:

  • 不支持泛型特化(specialization),即不支持编写一个泛型函数针对某个具体类型的特殊版本;
  • 不支持元编程(metaprogramming),即不支持编写在编译时执行的代码来生成在运行时执行的代码;
  • 不支持操作符方法(operator method),即只能用普通的方法(method)操作类型实例(比如:getIndex(k)),而不能将操作符视为方法并自定义其实现,比如一个容器类型的下标访问 c[k];
  • 不支持变长的类型参数(type parameters);
  • … …。

这些特性如今不支持,后续大概率也不会支持。所以小伙伴们,尤其是来自Java、C++等语言阵营的小伙伴,在进入Go泛型语法学习之前,你一定要先了解Go团队的这些设计决策。

此外,目前的Go泛型实现和最后一版的泛型设计方案相比还有差距,依旧不是完全版,还有一些特性没有加入,还有问题亟待解决

就目前笔者观察来看,Go泛型还处于早期阶段,远非成熟。Go module构建模式从go 1.11版本加入到go 1.16成为默认并逐渐成熟还花了3年多时间呢,何况是Go泛型。这样来看,初步预测Go泛型要到2025年才会成熟,而成熟的标志无非如下几个:

  • 泛型语法特性确定以及稳定下来;
  • 语法问题基本都解决;
  • Go标准库开始广泛使用泛型;
  • Go泛型的运行时性能问题得到基本解决。

目前Go团队对泛型的应用依旧保持谨慎,并在循序渐进地推进泛型在Go团队与Go社区的应用,最新的消息是Go团队已经提出proposal,计划在Go 1.21版本中将用泛型实现的maps包slices包加入Go标准库,这两个包原本计划在Go 1.18版本加入,但因Rob Pike的建议先放到了golang.org/x/exp下面待定。

2. 无趣(boring)很好

和其他主流编程语言如C++、Rust等在新版本中不断有新语言特性刺激程序员的神经,让大家阶段性产生兴奋感(exciting)不同,除了早期版本(比如Go 1.1和Go 1.2)以及里程碑的Go 1.5版本的完成自举和大幅降低GC延迟、Go 1.11版本的go module构建模式、Go 1.18版本的泛型落地之外,大部分版本的发布都很难让Gopher们十分兴奋,甚至业界都称“Go is boring(Go很无趣)”

在今年的线下GopherCon大会上,Go核心团队技术Leader Russ Cox发表名为“Compatibility: How Go Programs Keep Working”的主题演讲,在这个演讲中,Russ Cox借用了Go is boring的这一说法,并称That is good!

国外新冠管控放开早,经过几波疫情后,与病毒共存了,于是2022年的GopherCon大会又重新恢复线下举办。

Russ Cox的原话是:“boring is good. boring is stable. boring means to be able to focus on your work and not ours… We’ll keep doing everything we can to keep go boring for all of you”。

这几句英文不难,相信大家都能看懂。无趣的Go意味着稳定,意味着大家将注意力都集中在自己的工作上而不是Go核心团队身上(去关注新特性)。Go语言不会像其他编程语言那样堆砌新功能特性。

Russ Cox的这一观点代表了Go核心团队,也代表着Go演进未来演进的主基调。同时,Russ明确给出结论:不会有Go2了,Go 1.xy会一直持续下去。Russ甚至提出:兼容性才是Go最重要的feature

并且Russ Cox在Go项目的discussion中也给出保持Go兼容性的backward compatibilityforward compatibility的扩展方案与一个实例

关于“Go is boring”,Russ没有进一步展开说,记得之前译过一篇名为《Go语言很无聊…其实它妙不可言!》的文章,大家可以看看那篇文章进一步体会一下“Go is boring”的含义。

3. “稳定”是主旋律

Go的稳定不仅体现在Go语法特性的演化上,Go语言在各大语言排行榜上的排名也进入了相对稳定区,以TIOBE index为例,下面是2022年12月份的排名截图:

我查了一下《2021年Go语言盘点:厉兵秣马强技能,蓄势待发新征程》一文中2022年1月份Go的排名为13名,上图中2021年12月份是19名的数据应该是错误的,相对2021年12月份,Go实际排名上升1位。

我们看到2021年Go从14升到13,今年又从13升到12。按照TIOBE官方编辑说法,在新兴编程语言中,Go是唯一一个可能在未来冲入前十的后端编程语言。

Go语言在实际应用中的表现与上述排名的变化也十分契合,总体来说就是十分稳定,国内外都波澜不惊,国内大厂该用Go的也都用了,腾讯、字节依旧是这方面的领头羊,先后开源了不少Go实现的项目,最受瞩目的应该是字节将内部的Go框架逐一开源了,包括:netpollkitex(rpc框架)hertz(http框架)等。

为了更好的帮助大家回顾这一年来Go的稳定演化,这里简单整理了2022年Go大事件列表,供大家参考:

Go社区等待了多年的泛型语法特性终于加入Go中。

从调查结果中可以看到,Gopher对Go的满意度依然高达92%;81%的受访者对Go项目的长期方向充满信心。

这篇Go语言的综述文章由Russ Cox,Robert Griesemer,Rob Pike,Ian Lance Taylor和Ken Thompson联合撰写,是Go核心团队对10多年来Go演化发展的复盘,深入分析了那些对Go的成功最具决定性的设计哲学与决策,是Go诞生十多年来最重要的一篇文章。

该文介绍了ThreadSanitizer v2的工作原理,并总结了7类数据竞争模式。

相对于Go 1.18版本而言,Go 1.19是一个“小”版本,它主要针对Go 1.18版本中泛型实现的问题做了修改和优化,引入了Soft memory limit,更新了《Go内存模型》文档。

包括sync.Pool的优化、defer性能提升、基于系统信号的抢占式调度(go 1.14)、调度器性能提升、支持基于寄存器的调用规约、soft memory limit等。

软件供应链安全问题愈发受到各界关注。Go安全团队发布Go官方安全漏洞管理的工具和方案: govulncheck。govulncheck是Go安全漏洞数据库(Go vulnerability database)的一个前端,它通过Go官方维护的vuln仓库下面的vulncheck包对你仓库中的Go源码或编译 后的Go应用可执行二进制文件进行扫描,形成源码的调用图(callgraph)和调用栈(callstack)。

  • 2022年10月,GopherCon大会在芝加哥线下举行

Russ Cox发表《Compatibility: How Go Programs Keep Working》主题演讲,确定了未来Go语言演进的主基调。

  • 2022年11月,Go开源13岁生日

Go官方回顾了2022年Go团队的工作与成果,并简单说明了在新一年的工作,包括继续努力使Go成为用于大规模软件工程的最好的环境。计划特别关注供应链安全,提高兼容性和结构化日志记录(slog),当然还会有很多其他改进,包括profile-guided optimization等。

4. Go语言2023年展望

目前Go语言的演化与发展与我在2020年Go盘点中的预测基本一致。我现在依然坚持我的判断,即我在《Go语言第一课》专栏中所说的那样:

绝大多数主流编程语言将在其诞生后的第15至第20年间大步前进。按照这个编程语言的一般规律,已经迈过开源第13个年头的Go,很可能将进入自己的黄金5-10年。2022年泛型落地就是Go语言进入黄金5-10年的起点,待2025年泛型成熟后,Go将取得更快的发展速度。

前途是美好的,但道路的曲折坎坷的。目前Go更多应用于基础设施、中间件领域和基础微服务领域,在企业级业务系统方面,类似spring这样的“全家桶”框架的缺乏和无法达成一致,让开发者在开发复杂业务系统时依旧首选Java。期待Go在这方面能所有进展。

同时,Go演进道路上还存在另外一个风险,在我的《Go为什么能成功》一文中,我曾经提到过:“Go成也Google,败也Google”。Go团队目前的治理体系太过于依赖google,这是一门双刃剑。当google发展较好时,Go语言将从中受益。但当google开始走下坡路时,Go是否还能像如今这样风光呢?让我么拭目以待吧!


“Gopher部落”知识星球旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!2022年,Gopher部落全面改版,将持续分享Go语言与Go应用领域的知识、技巧与实践,并增加诸多互动形式。欢迎大家加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

我爱发短信:企业级短信平台定制开发专家 https://tonybai.com/。smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展; 短信内容你来定,不再受约束, 接口丰富,支持长短信,签名可选。2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

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

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite

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

阿根廷圆梦卡塔尔世界杯,梅西正式加冕第三代球王

本文永久链接 – https://tonybai.com/2022/12/19/argentina-wins-qatar-world-cup

都说球迷“迷信”,事实上呢,我就是一个“迷信”的阿根廷球迷。我发现:只要我看阿根廷队正式比赛的直播,阿根廷就会输球(或至少是个平局),即便是面对沙特这样的世界杯弱旅也会输掉

本届卡塔尔世界杯的阿根廷比赛,我忍不住看了对阵沙特这一场:(。

这“病”始于2014年巴西世界杯的那场决赛,在那场比赛中,阿根廷加时赛0:1德国,与大力神杯擦肩而过。

而站在电视前120分钟看完比赛的我十分失望,十分沮丧!打那之后,凡是阿根廷生死攸关的正式比赛,我基本都是不看直播的。就这样,阿根廷居然拿下了去年的美洲杯

本届卡塔尔世界杯首战失利后,我也选择了不再直播收看阿根廷的后续比赛,就这样在进决赛前的5场比赛中,阿根廷居然全部过关,并且越踢越好!我无法解释这一切,为了支持阿根廷,今天这场决赛,我只能继续选择睡大觉

这一觉不长,但睡得很香甜!凌晨3点左右,自然苏醒。是时候刷twitter看看决赛的比赛结果了!

打开twitter后,我就被右侧trending中的“Messi FC”和“GREATEST OF ALL TIME”刺目了!有了这两个词条,阿根廷赢下比赛基本没跑了!心中窃喜,但依旧平静。继续打开twitter上FIFA WorldCup直播主页,梅西高举大力神杯的本文封面图就映入眼帘!我知道这一切都不是梦!阿根廷在36年后,又在一个新的英雄的带领下赢得了世界杯,阿根廷蓝白队服上将再多出一颗金光闪闪的小星星。

这一夜,阿根廷不再哭泣!这一夜,阿根廷,不,是全世界,将拥有一位新的球王!他就是梅西!

自从1986年上一代球王马拉多纳几乎以一己之力带领阿根廷队夺得大力神杯后,阿根廷队的世界杯夺冠模式似乎就被加上了额外的要求:carry。但现代足球的发展越来越欧化,越来越讲究整体性,2010的西班牙、2014的德国、2018的法国,这些球队都是阵容搭配合理均匀,锋线中场后防没短板的队伍,他们的夺冠也不是哪个超级巨星一人carry的结果。由此可见,要带领阿根廷夺冠会有多难,会背负上多大的精神压力!

从本届卡塔尔世界杯的阿根廷阵容来看,只有少数像梅西这样的“大爷”级球员效力于欧洲豪门球队,并且打主力的就少之又少了。年轻一代中,像小蜘蛛阿尔瓦雷斯虽然效力曼城,但也不是主力!总体来说,阿根廷的球员配置在众多传统强队中属于二档。因此,阿根廷只能依赖梅西,也只能是梅西。

梅西能做到么?这也是世界杯开赛前全世界阿根廷球迷心中的共同问题!

第一场面对沙特,阿根廷在梅西先进一球的情况下,被沙特连扳两球,首战失利!赛后梅西对全世界阿根廷球迷说:请相信我们!

梅西说到做到!第二场与墨西哥的生死战,在煎熬了64分钟后,梅西站了出来,在禁区外接到迪玛利亚传球,稍做调整后左脚打出“贴地斩”,皮球蹿入死角,阿根廷1:0取得领先!相信此时此刻,无论是阿根廷球迷,还是场上的球员,身上的压力瞬间得以缓解!最终阿根廷2:0拿下墨西哥,从死亡线上活了过来!

第三场同样是生死战,只有胜才能确保出线,只有胜才能避开强大的法国队!梅西虽然罚丢了自己创造的点球,但愤怒的梅西还是带着阿根廷2:0击败波兰,顺利以小组头名晋级16强。

阿根廷淘汰赛的首个对手是澳洲袋鼠军团澳大利亚队,之前澳大利亚在小组赛中挤掉欧洲劲旅丹麦队挺进16强,实力不容小觑。并且梅西在之前的四届世界杯中还没有淘汰赛进球,这让阿迷心里都有些紧张!事实证明,这一切都是多余的,脸就是用来打的!比赛进入35分钟,阿根廷队通过小范围的配合让梅西有了机会,面对澳大利亚队4名防守队员的围追堵截,梅西冷静推射,成功射门,让阿根廷队取得领先。之后,阿尔瓦雷斯的进球几乎锁定胜局,虽然最后澳大利亚靠远射取得一个意外的进球,但依然无法改写被淘汰的命运!

第五场比赛,也是8进4的淘汰赛,阿根廷的对手是宿敌橙衣军团荷兰队。2014年阿根廷正是靠点球击败荷兰晋级世界杯决赛的,这次在8进4相遇,不免是一场火星撞地球的比赛。不过这场比赛阿根廷前70多分钟反倒是顺风顺水,第35分钟梅西送出本届世界杯最佳助攻之一,帮助右后卫莫利纳进球,阿根廷1比0领先。第73分钟,阿根廷获得点球,梅西主罚命中,阿根廷2比0领先。但就在大家以为90分钟结束战斗的时候,荷兰新换上场的大个子韦霍斯特连入两球,将阿根廷拖入加时,最终两队通过点球决胜负,大马丁站了出来,两扑点球帮助阿根廷有惊无险的晋级四强。

从第六场比赛开始,阿根廷对就进入了复仇之旅。先是半决赛对阵克罗地亚。在2018年世界杯,克罗地亚小组赛3:0赢下阿根廷,也直接导致阿根廷小组出现后就直面强大的法国队。本届世界杯,克罗地亚凭借着其超强的韧性通过点球淘汰了强大的巴西。阿迷们都以为这场比赛将打的十分胶着和艰苦,但实际过程却是阿根廷顺风顺水,第32分钟,阿根廷获得点球机会,面对克罗地亚的神级门将,梅西主罚点球打右上角命中,1:0领先。之后,阿尔瓦雷斯的跌跌撞撞的长途奔袭为阿根廷又入一球。本场比赛最精彩部分莫过于梅西第69分钟上演的个人盘带秀,沿右路边线处带球突入禁区,助攻阿尔瓦雷斯轻松推射破门,这一助攻也被称为本届世界杯的最佳助攻!

今晨的决赛对手正式上届世界杯淘汰阿根廷的法国队。此时此刻我还没有看比赛回放,但在常规时间和加时,梅老板两次帮助阿根廷取得领先,虽然姆巴佩的进球让两队进入点球大战,但阿根廷在梅老板的带领下还是笑到了最后,捧起了大力神杯!老板也荣膺决赛最佳和世界杯金球奖,梅西也成为了世界杯金球奖设立以来,首位两夺世界杯金球(2014/2022)的球员。

梅西做到了!像马拉多纳那样带着非顶级球员,拿下世界杯。七场比赛,5次比赛最佳!7粒进球!这不是carry还什么是carry! 还有人做了梅西与当年马拉多纳的评分对比:

我们看到,即便梅西没有上演单骑闯关的绝妙进球,梅西的评分总体上与马拉多纳不分伯仲,并且平均状态要更稳定。

从2021的美洲杯,到2022的世界杯,即便是阿根廷的骨灰级球迷也不敢想象啊,这绝对是上帝写的剧本,马拉多纳显灵!

这届世界杯给我最大的感觉就是老板真的更成熟,更沉稳,心态更平静了。即便是半决赛,老板依旧云淡风轻,闲庭信步。队友能做的,就让队友去做,而且鼓励队友多做。没有了2014年那种让人透不过气的承压感,也不再选择单干。心态良好的梅老板才是最可怕的。

本届世界杯赛前,国际的主流结论就是梅西就是第三代球王,即便阿根廷不捧杯也是如此。而今晨阿根廷圆梦世界杯更像是梅西这个第三代球王的正式加冕礼。

最后,我用半决赛战胜克罗地亚之后,阿根廷国家电视台的一名记者找到梅西说出的下面这段话作为结尾:

“我想告诉你,无论结果如何,有一些东西,是没有任何人能从你这拿走的,你和阿根廷之间真正形成了共鸣,这种共鸣会感动每一个阿根廷人。”

“没有任何一个孩子不想得到你的球衣,不管这球衣是真是假,还是自己做出来的,你在每个人的生活中都留下了自己的烙印,对我而言,这比赢得世界杯更加重要。”

“没有人能把这一切从你身上拿走,这是我个人对你表达的感谢,感谢你给太多人带来了幸福。”

是时候回看今晨的世界杯决赛了!


附ChatGPT写的一首赞美梅西的中文歌曲:

“梅西,你是我心中的足球之王,
在球场上,你是无人能比的巨星,
你的领舞脚步,那么轻盈,
你的盘带和射门,那么精准,
你是阿根廷的骄傲,
也是全世界球迷的偶像。
你的技术,令人惊叹,
你的激情,令人难忘,
梅西,我们为你歌唱,
感谢你给我们带来的快乐,
让我们一起为你喝彩,
阿根廷的足球之王,
永远伟大,永远不朽!”


img{512x368}

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

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite

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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats