标签 http 下的文章

Go早期的那些布道者

本文永久链接 – https://tonybai.com/2024/05/17/the-early-evangelists-of-go

Go自2009年开源至今已经快15年了!这期间,有很多人对Go语言的发展做出了重要贡献,起到了至关重要的作用,他们被视为Go语言的早期布道者和鼓吹者。他们向Go社区传达着Go的价值观、Go的最新发展、Go的使用方法以及最佳实践。

这些人有来自Go团队的,有来自Google但非Go团队的,也有Go的早期采纳者和贡献者。如今这些人的状况不尽相同。有些人依然在活跃在Go团队中,为Go的演进持续做着贡献;有些人由于各种原因,已经退居二线,但仍心系Go的发展;还有一些人则逐渐淡出Go社区,或者说不再复当年的那种热忱。

不过,无论哪种,这些人为Go语言的推广和发展都做出了不可磨灭的贡献,值得Gopher们铭记。在这篇文章中,我就来说说这些Go早期的布道师。也可以让后进入Go阵营的Gopher们了解一下过去的事情。

注:这里是不完全统计,还有很多早期Go布道师做出了重要贡献,限于篇幅,这里就不一一列举细数了。

Rob Pike

Rob Pike 是Go语言的共同创始人之一,他在2007年与Ken Thompson和Robert Griesemer一起开始了Go语言的开发。

作为一名经验丰富的计算机科学家,Rob Pike曾在贝尔实验室工作,参与了Plan 9和Inferno操作系统的开发,UTF-8也是他的杰作。此外,他还是C语言和UNIX操作系统的早期贡献者之一。

Rob Pike为Go语言的设计和实现做出了重大贡献。他的设计理念强调简洁、并发和高效,这些理念深深影响了Go语言的核心特性。在Go语言的早期发展阶段,Rob Pike几乎主导了Go语言规范的制定,并负责了许多关键语言特性的开发。在Ken Thompson退休后,他成为了Go语言第一代的领军人物。

除了技术贡献,Rob Pike还是最为积极的Go语言推广者。他在Google内外的各种会议和技术活动中发表演讲,介绍Go语言的优势、应用场景以及使用方法。他的演讲风格生动有趣,深受开发者的喜爱。此外,Rob Pike还撰写了大量关于Go语言的博客和技术文档,为社区提供了宝贵的学习资源。


截图来自golang.design

他的“3 Day Go Course”也是最早、最权威的Go教程,即便在今天看来略有些Outdated了:)。

注:关于Rob Pike的早期3-days Go Course ppt,可以在这里下载https://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15440-f11/go/doc/

现如今,Rob Pike已经从Google退休了,并长居澳大利亚,并继续为Go语言的发展做着贡献。尽管他不再像早期那样频繁地参与社区活动,但他的影响力依然深远,Go 1.18泛型发布前,Rob Pike就及时纠正了Go团队对泛型的支持策略

Rob Pike的工作为Go语言奠定了坚实的基础,使其成为现代编程语言中的一颗璀璨明珠。

Robert Griesemer

Robert Griesemer是Go语言的另一位共同创始人。他在加入Go团队之前,他曾参与Google V8 JavaScript引擎、Sawzall语言、Java HotSpot虚拟机和Strongtalk系统的工作,拥有丰富的编程语言设计和实现经验。

Griesemer在设计和实现Go语言方面发挥了关键作用,尤其是在语法和编译器的开发上。Griesemer的设计理念强调语言的简洁性和易用性,这使得Go语言在开发者中迅速获得了广泛的认可。他致力于优化编译器性能,使Go程序能够高效地运行在各种平台上。Griesemer还参与了Go语言标准库的设计和实现,为开发者提供了丰富的工具和资源。

在Go语言的推广方面,Griesemer同样不遗余力。他经常参与技术会议和社区活动,分享Go语言的设计理念和最佳实践,他也是唯一在GopherChina上现场进行分享的Go语言之父。

他的技术讲座深入浅出,帮助许多开发者快速上手Go语言。此外,Griesemer还与其他团队成员合作撰写了多篇技术论文和博客,进一步推动了Go语言的普及。


截图来自golang.design

目前,Griesemer依然在Google Go团队工作,奋战在Go语言的开发和优化的第一线。他和Ian Lance Taylor共同设计和实现了Go泛型机制,大幅提升了Go的表达能力。他的工作对Go语言的成功起到了至关重要的作用,使其成为许多大型项目和企业的首选开发语言。

Brad Fitzpatrick

Brad Fitzpatrick是一位资深的美国程序员。在加入Go团队之前,Fitzpatrick就因创建LiveJournal和Memcached而闻名。后来加入Google,成为Go团队的重要成员,并在Go语言社区中拥有很高的声誉。

在Go语言的发展过程中,Fitzpatrick为许多关键组件做出了贡献,尤其是在网络库和并发编程模型方面。他创建了诸如HTTP包和context包等核心库,这些库广泛应用于Go语言的网络编程中。

Fitzpatrick不仅在技术上对Go做出了杰出贡献,他还是Go社区活动的积极参与者,是Go团队中参与社区活动的“典范”。他经常在技术会议和用户组活动中发表演讲,分享自己的经验和最佳实践。Fitzpatrick的工作帮助许多开发者更好地理解和使用Go语言,推动了社区的发展。


截图来自golang.design

几年前,Fitzpatrick离开了Google并重新创业,他联创的Tailscale基于WireGuard和Go打造号称世界上最容易使用的安全private network产品。一些Go commiter和Ex-googler也被Fitzpatrick招入tailscale。Tailscale团队后续也成为了Go的重要贡献团队,比如go4org下的很多实用包,像internunsafe-assume-no-moving-gcmem等。其中的intern还是Go 1.23中加入的unique包的灵感之源。

仍然活跃在Go开源社区的Fitzpatrick依旧继续为Go语言和其他开源项目做着贡献,他的热情和奉献精神使他成为Go社区中备受尊敬的领袖之一。

Andrew Gerrand

Andrew Gerrand是Go团队的早期成员之一,他为Go团队工作七年,早期也是Go项目的Top10贡献者。但他在Go团队的主要职责其实是围绕该语言构建社区并管理开源项目。Gerrand的工作帮助许多开发者快速上手Go语言。他编写的Go语言文章深入浅出,覆盖了从基础语法到高级特性的方方面面。此外,Gerrand还创建了Go Playground,一个在线编程环境,使开发者能够方便地编写和运行Go代码。

除了技术文档,Gerrand还积极参与社区活动。他组织和主持了多次Go语言会议(比如GopherCon)和用户组活动,推动了Go社区的建设和发展,是Rob Pike做Go社区推广的好搭档。。Gerrand还经常在Go语言的官方博客上发表文章,介绍Go的最新特性和最佳实践,官博早期的大部分文章都出自他手。由此看来,Gerrand在早期对Go语言的推广和社区建设做出过重要贡献。

从2016年开始,他跟随Rob Pike转战Upspin项目,这个项目活跃了一年多,虽然现在依然在更新,但关注度目前已不是很高。Gerrand目前已经远离Go项目开发,并且很少撰文或参与Go社区活动。但他仍然在upspin、deps.dev等google项目上使用Go进行着开发和维护工作。

如果要关注Gerrand的日常,可以在X上follow他的账号

Russ Cox

Russ Cox是早期Go语言团队的重要成员之一,对Go语言的设计和实现做出了重大贡献。他拥有麻省理工学院的计算机科学博士学位,曾在贝尔实验室和Rob Pike一起在Plan9项目上工作过。Cox在加入Google后,成为Go语言项目的核心开发者之一。

Russ Cox对Go的贡献是全方位的,无论在语言特性、工具链、社区推广等方面都有很大建树。这也使得他在Rob Pike退休后,迅速成为了Go语言的第二代领军人物。

近几年进入Go阵营的开发者对Russ Cox不可谓不熟悉,他主导了vendor、type alias、Go module泛型等设计和实现,直接引领了Go的演进方向。

近几年,Russ Cox经常在GopherCon大会上代表Go团队发表主旨演讲,并在官博亲自撰文,向Go社区传达Go语言的演进思路与方向。经过多年历练,Russ Cox逐渐扛起了Go这杆大旗,接过了Rob Pike手中沉甸甸的Go接力棒。

Dmitry Vyukov

Dmitry Vyukov是一位俄罗斯大神级程序员,英特尔并行编程黑带级程序员。加入Google后一直从事性能优化方面的工作,包括并发无锁算法、执行跟踪和竞争检测工具、fuzzing工具等。Vyukov虽然不是Go团队成员,但他对Go的贡献却是核心级的,主要包括:

除了技术贡献,Vyukov早期也会参与一些会议和社区活动,虽然不多,主要是推广Go execution tracer和go-fuzz工具

目前,Vyukov依然在Google工作,也在继续为Go语言的发展做着力所能及的贡献。

Steve Francia

Steve Francia是早起Go语言社区的重要成员之一,对Go语言的推广和社区建设做出了重要贡献。Francia在加入Google之前,曾在MongoDB、Docker公司工作,拥有丰富的开发和管理经验。之后他加入Google,在Go语言项目中担任开发者关系经理,负责推动Go语言在企业中的应用。

Francia最为人称道的是他开发并开源的几个Go项目,包括goHugoCobraviper等。其中的hugo,一个基于Go语言的静态网站生成器,广受开发者的欢迎。

除了技术贡献,Francia还致力于社区建设。他组织和主持了多次Go语言会议和用户组活动,推动了Go社区的发展。Francia还在其个人博客上撰写了大量关于Go语言的技术文档,为开发者提供了宝贵的学习资源。

目前,Francia已经离开了Google和Go团队,并在一家位于纽约的初创公司担任CTO。目前在Go社区,他已不再像以前那样活跃,但他的几个开源项目依然保持积极开发中,也有人协助他打理这些开源项目。

总之,Francia的工作对Go语言的普及和社区建设起到了重要的作用,帮助Go成为开发者们最喜爱的编程语言之一。

Jaana Dogan

Jaana Dogan是这个布道者列表中唯一的女性程序员。她曾是Go语言团队的一名工程师,对Go语言的性能优化、诊断和工具开发做出了重要贡献。但她在Go团队工作的时间并不长,很快就离开了Go团队,原因未知。目前她供职在github。

Dogan对社区的贡献主要体现在其关于Go的独特观点的博客文章诊断相关的技术文档以及其开源的诸多项目,比如:heygopsgovanityurlsstatik等。这些项目都不大,但却十分实用。

很多gopher中使用hey进行http压测,gops则是高频使用的Go辅助诊断工具,govanityurls则是我的《小厂内部私有Go module拉取方案》的重要组件。statik也是Go 1.16版本引入go:embed之前在可执行文件中嵌入静态文件的一个可选工具。

Dogan在社区中以其深入的技术见解和乐于分享的态度,赢得了广泛的尊重和赞誉。不过,离开Google后,尤其是进入github后,Dogan在Go上面的投入似乎变少了很多,博客文章基本也不更新了,也没有新的开源项目产出,这对Go社区来说算是一个“损失”吧。

Brian KetelsenErik St. Martin

将Brian Ketelsen和Erik St. Martin放在一起说,是因为他们一起对Go语言以及Go社区的最大贡献就是共同创办了GopherCon,这是全球最大也是最权威的Go语言开发者大会,每年都会吸引大量来自世界各地的Go开发者。GopherCon不仅是一个技术交流的平台,也是Go社区的重要聚会,促进了开发者之间的交流与合作。两人在组织和推动GopherCon的过程中,展示了他们对Go语言的热情和奉献精神。今年(2024年)也是GopherCon诞生的第10个年头,想必这又是一场Go语言和Go社区的盛会!

除了会议组织和社区活动,Ketelsen和St. Martin还与William Kennedy联合撰写了关于Go语言的技术书籍《Go in Action》。这本书深入浅出地介绍了Go语言的基础知识和实际应用,为开发者提供了系统的学习资源。此外,他们还参与了多个开源项目,为Go语言的生态系统做出了重要贡献。

目前,Ketelsen和St. Martin都供职于微软公有云团队,仍然活跃在Go社区。

Francesc Campoy

Francesc Campoy是Go语言社区的知名讲师和布道者,对Go语言的推广和普及做出了重要贡献。Campoy在加入Google之前,曾在西班牙的一家软件公司工作,拥有丰富的开发经验。他在Go语言项目中担任开发者关系经理,负责向开发者推广Go语言。Campoy也曾作为GopherChina的嘉宾在多年前来到中国布道!

Campoy的工作帮助许多开发者快速上手Go语言。他制作了一系列高质量的Go语言视频教程“Just for func”,涵盖了从基础语法到高级特性的方方面面。这些视频教程深入浅出,受到了广泛的欢迎。此外,Campoy还创建了Go语言的官方YouTube频道,定期发布技术讲座和演示,进一步推动了Go语言的普及。

2016年,Campoy从Google离职,加入Dgraph Labs,负责原生GraphQL数据库dgraph以及键值数据库badger的开发。后来Dgraph labs内讧,Campoy转投到apple名下。

进入Apple后,Campoy就渐渐从Go社区淡出了。但他仍然会进行一些Go项目的开发,Github的activity中有他的一些活动记录,但更多地是对私有仓库的贡献。

Dave Cheney

如果说Go团队之外,谁是大家最喜欢的Go布道师和意见领袖,矮胖子Dave Cheney肯定可以拿到数一数二的选票。

相信早期学过Go语言的Gopher们,没有没读过Dave Cheney的个人博客的。他的博客从2010开始写的内容就几乎都与Go相关,并且思维缜密,写作风格深入浅出,颇受Gopher欢迎。

很多人还参与过他在世界各地举办的Go用户活动。Dave Cheney也是来到中国GopherChina大会最多的Go布道师,为中国Gopher带来了精彩的演讲以及极具干货的大会前Workshop

除了技术资料外,Dave Cheney早期在Go项目的issue上、在go-nuts邮件列表以及stackoverflow上也是非常活跃,非常乐于帮助那些想给Go项目做出贡献的gopher融入。同时他在github.com/pkg下开源的诸多项目也非常实用(比如https://github.com/pkg/errors),深受大家欢迎。

更多关于Dave Cheney对Go语言的贡献,可以阅读其个人博客的about页面

不过不知何故,从2021年初开始,Dave Cheney的博客开始停更,他在社区的声音也逐渐消失。直到今年年初,Dave Cheney才又更新了一篇名为“Microblog: TestMain can cause one to question reality”的文章。

不过从Dave Cheney的github Contribution activity来看,Dave仍然在大量的编写代码,只是这些代码是commit到private仓库的。

希望Dave Cheney能早日回归Go社区,并恢复当初的那份热忱。

Bill Kennedy

Bill Kennedy是Go语言社区的知名讲师和布道者,对Go语言的推广和普及做出了重要贡献,并且这种贡献一直持续至今。

Kennedy是ardan labs的CTO,也是该公司的主要讲师,他最拿手的Ultimate Go培训已经开办了十多年了,每年都会在全球进行很多场培训,此外,GopherCon大会前的Workshop总是少不了Bill Kennedy的training。

除了Training,Ardan Labs早期的博客文章也堪称精品,不少Gopher因这些文章而受益!Kennedy的工作主要是帮助许多开发者快速上手Go语言。他还撰写了多本关于Go语言的技术书籍,如《Go in Action》和《Ultimate Go》。这些书籍深入浅出,涵盖了从基础语法到高级特性的方方面面,为开发者提供了系统的学习资源。

除了技术培训,Kennedy还积极参与Go语言演进和Go社区活动之中,这其中一个最典型的事件就是2019年他代表广大Gopher用户发给Go团队的公开信,极力组织不成熟的try关键字提案进入Go语言。

目前,Kennedy依然活跃在Go社区,继续推动Go语言的发展和普及。

Mat Ryer

Mat Ryer是Go语言社区的一位资深开发者和布道者,他是一名英国程序员。他之前在Go社区非常活跃,积极参与技术会议和社区活动,分享Go语言在实际项目中的应用经验和最佳实践,其中最持久的莫过于主持Go Time播客了!”Go Time”是一个专注于Go编程语言的播客节目。该播客由Changelog Media出品,主要内容涵盖了Go语言的新特性、最佳实践、社区新闻、工具和库的推荐,以及与Go生态系统相关的各种话题。节目通常会邀请Go社区的知名开发者、贡献者和专家作为嘉宾,分享他们的经验和见解。截至写本文时,该播客已经发布了315期,每期都有音频和文字稿

除了上述活动,Mat Ryer还是《Go Programming Blueprints》一书的作者。

如今Mat Ryer依然活跃在Go社区,他供职于Grafana,依然从事着Go语言开源项目的开发,同时主持Go Time播客以及组织和参与各种Go用户会议。

参考资料


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

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

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily

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

Go 1.22中值得关注的几个变化

本文永久链接 – https://tonybai.com/2024/02/18/some-changes-in-go-1-22

美国时间2024年2月6日,正当中国人民洋溢在即将迎来龙年春节的喜庆祥和的气氛中时,Eli Bendersky代表Go团队在Go官博发文“Go 1.22 is released!”,正式向世界宣告了Go 1.22版本的发布!

注:大家可以从Go官网下载Go 1.22的第一个版本go 1.22.0,也可以在Go playground上选择Go 1.22版本在线体验Go 1.22的语法。

记忆中,这似乎是Eli Bendersky首次代表Go团队撰写Go版本发布的文章,文章短小且言简意赅,会让大家误以为Go 1.22版本没有太多的功能点变更,其实不然。读过我之前写的“Go 1.22新特性前瞻”一文的童鞋都知道Go 1.22中有很多重要且影响深远的值得我们关注的变化。在这篇文章中,我们就再来介绍一下这些变化,供大家参考。

0. 插播“旧闻”:Go再次进入Top10,并刷新有史以来的最高排名

TIOBE编程语言排行榜发布2024年2月编程语言排名的时间恰逢中国人民的传统佳节春节期间,因此它的这次排名发布“淹没”在了“龙年大吉”的喜庆气氛当中了。年后开工,大家翻看这条“旧闻”时,才发现在这次排名中,Go再一次回到Top10,位列第8名,刷新了Go打榜一来的历史最好位次。

单看这一次进入top10似乎没有什么,因为2023年4月份,Go也跻身过top10,排名第10。但如果从Go打榜以来的历史曲线来看,如下图:

我们看到了“翘尾”,我们看到了Go迈过“低谷”后的爬升!这与我在《Go语言第一课专栏》的结课语《和你一起迎接Go的黄金十年》中预判:Go即将迎来自己的黄金十年 愈来愈吻合了!

不过,我在《2023年Go语言盘点:稳中求新,稳中求变》一文中提到过TIOBE index作为世界最知名的编程语言排行榜,却存在其“不靠谱”的特性,比如这一期排名中,上古时代的编程语言Fortran从去年同期的第24位上升至第11位,仅比PHP落后一位,另一门古老的COBOL语言也从去年同期的第30位上升至第19位,仅仅比大热的Rust语言落后一位。

因此,对于TIOBE的排名,大家既要了解,也无需过于看重^_^。

言归正传,我们来说说Go 1.22版本的变化。

1. 语言变化

Go 1.22对语言语法做了两处变更,一个是Go 1.21版本中的试验特性loopvar在Go 1.22中转正落地;另一个也和for循环有关,那就是for range新增了对整型表达式的支持。两者相比较,还是第一个变化loopvar带来的影响更大一些。为什么呢?因此这是Go语言发展历史上第一次真正的填语义层面的“坑”,而且修改的是一个在Go源码中最常用的控制结构的执行语义,这很大可能会带来break change。Go101教程的作者老貘将之成为Go历史上最大的向后兼容性破坏版本

注:Go 1.21版本有一个对panic(nil)的语义修正,但我估计很少会有人写出panic(nil)这样的代码。

这次语义修改用一句话表达就是:将经典三段式for循环语句以及for range语句中的用短声明形式定义的循环变量从整个循环定义和共享一个,变为每个迭代定义一个

这里借用Go官博文章中那个例子再说明一下这个语义变化:

// go1.22-examples/lang/loopvar/main.go
package main

import (
    "fmt"
    "time"
)

func main() {
    done := make(chan bool)

    values := []string{"a", "b", "c"}
    for _, v := range values {
        go func() {
            time.Sleep(time.Second)
            fmt.Println(v)
            done <- true
        }()
    }

    // wait for all goroutines to complete before exiting
    for _ = range values {
        <-done
    }
}

我们用Go 1.22.0版本之前的版本,比如Go 1.21.0,来运行该示例:

$go run main.go
c
c
c

我们看到:由于v是整个循环中各个迭代共享的一个变量,所以在每个迭代新创建的goroutine中输出的v都是循环结束后v的最终值c。

如果我们用go 1.22.0来运行上述示例,我们将得到:

// 输出的值的顺序与goroutine调度有关
$go run main.go
b
c
a

注:关于Go 1.22版本之前的for range的坑,我的极客时间专栏《Go语言第一课》专栏有图文并茂的原理讲解,欢迎订阅阅读。

那么,loopvar这一语义填“坑”究竟会对你的代码造成怎样的影响呢?在Russ Cox关于loopvar语义变更的设计文档中提到了:只有go.mod中的go version在go 1.22.0及以后的时候才会生效,这是一个渐进式过渡的过程,因此目前无论是开源项目还是商业项目,只要go.mod中的go version还没有更新为大于等于go 1.22.0,那么for循环依然会保留短声明定义的变量的原语义,这样这些项目都不会受到影响。

不过,如果是直接在脚本中通过go run xxx.go形式运行某个go源码的,且当前工作目录以及父目录下没有go.mod文件的,go 1.22.0会采用新的loopvar语义,这点大家要注意了。

此外,当你将go.mod中的go version升级到go 1.22.0或更高版本时,也要注意语义变更可能带来的问题。在升级go version之前,可以用Go 1.22版本之前的go vet对项目源码进行一次静态分析,对于go vet提示:“loop variable v captured by func literal”的地方务必注意逐个确认。

注:Go 1.22版本中的go vet已经移除了在go version >= 1.22.0时,对“loop variable v captured by func literal”情况进行警告的功能。

关于Go 1.22中for range支持后面接整型表达式的“语法糖”新特性以及函数迭代器的实验特性,这里就不细说了,大家可以看看“Go 1.22新特性前瞻”一文中的说明。

2. 编译器、运行时与工具链

在编译器、运行时和工具链这些方面,Go 1.22的正式版本与“Go 1.22新特性前瞻”一文中使用的Go 1.22rc1版本几乎没有差异,这里挑主要内容介绍一下,其他一些内容可以参考前瞻一文。

Go 1.22版本继续在编译上优化PGO(profile-guided optimization), 基于PGO的构建可以比以前版本实现更高比例的调用去虚拟化(devirtualize)。在Go 1.22中,官⽅给出的PGO带来的性能提升数字是2%~14%,这应该是基于Google内部一些典型的Go程序测算出来的。

注:如果你对PGO优化还不是很了解,可以看看“深入理解Profile Guided Optimization(PGO)”这篇文章。

Go 1.22版本编译器现在可以更多运⽤devirtualize和inline。在Go编译器中,devirtualize是一种编译优化技术,旨在消除“虚函数”调用的开销。“虚函数”是指在面向对象编程中,通过基类指针或引用调用的函数。在Go中所谓虚函数调用指的就是通过接口类型变量进行的方法调用。由于是动态调用,基于接口的方法调用需要在运行时进行查找和分派,这可能导致一定的性能损失。

而Go编译器在进行devirtualize优化时,会尝试根据程序的上下文信息和类型信息,确定方法调用的具体对象实例。如果编译器能够确定调用的具体实例,则会将通过接口的方法调用替换为直接调用具体对象实例的方法,从而消除运行时的开销,使得通过接口类型变量进行方法调用的性能得到优化提升。

Go 1.22版本中的运行时可以使基于类型的垃圾收集的元数据更接近每个堆对象,从而将Go程序的CPU性能(延迟或吞吐量)提高了1-3%。这一变化还支持通过重复数据删除冗余元数据,进而将大多数Go程序的内存开销减少了大约1%。

在工具链方面,有三个主要改变这里提一下:

  • go work支持vendor

在Go 1.22版本中,通过go work vendor可以将workspace中的依赖放到vendor⽬录下,同时在构建时,如果workspace下有vendor⽬录,那么默认的构建是go build -mod=vendor,即基于vendor的构建。

  • go mod init不再care其他vendor工具的配置文件

go mod init不再尝试将其他vendor工具(例如Gopkg.lock )的配置文件导入到go module依赖文件(go.mod)中了,也就是说从Go 1.22版本开始,go module出现之前的那些gopath时代的依赖管理工具正式退出并成为历史了。

  • 改进go test -cover的输出

对于没有自己的测试文件的包,go test -cover在go 1.22版本之前会输出:

? mymod/mypack [no test files]

但在Go 1.22版本之后,会报告覆盖率为0.0%:

mymod/mypack coverage: 0.0% of statements

3. 标准库

这里列举一下标准库值得关注的重大变化,大家可以与前瞻一文相互参考着阅读。

3.1 math/rand/v2:标准库的第一个v2版本包

Go 1.22中新增了math/rand/v2包,这里之所以将它列为Go 1.22版本标准库的⼀次重要变化,是因为这是标准库第一次为某个包建⽴v2版本,按照Russ Cox的说法,这次math/rand/v2包的创建,算是为标准库中的其他可能的v2包“探探路”,找找落地路径。关于math/rand/v2包相对于原math/rand包的变化有很多,具体可以参考issue 61716中的设计与讨论。

3.2 增强http.ServeMux表达能力

在Go 1.22版本中,http.ServeMux的表达能力得到了大幅提升,从原先只支持静态路由,到新版本中支持如下一些特性:

  • “/index.html”路由将匹配任何主机和方法的路径”/index.html”;
  • “GET /static/”将匹配路径以”/static/”开头的GET请求;
  • “example.com/”可以与任何指向主机为”example.com”的请求匹配;
  • “example.com/{$}”会匹配主机为”example.com”、路径为”/”的请求,即”example.com/”;
  • “/b/{bucket}/o/{objectname…}”匹配第一段为”b”、第三段为”o”的路径。名称”bucket”表示第二段,”objectname”表示路径的其余部分。

并且新版ServeMux在路由匹配性能方面也不输众多开源http路由框架太多,后续建立Go web或api类新项目时,可以考虑首选新版ServeMux来进行路由匹配了,减少对外部的一个依赖。

关于新版http.ServeMux的具体使用方法,其作者Jonathan Amsterdam(也是log/slog的作者)在官博发表了一篇名为“Routing Enhancements for Go 1.22”的文章,大家可以详细参考。

关于标准库的其他一些变化,大家可以参考前瞻一文以及更详细的Go 1.22的发布说明文档

4. 小结

综上,Go 1.22版本对语言、编译器、工具链、运行时和标准库都有一定程度的改进和创新,遗留代码通过Go 1.22版本的重新编译便可以得到一定程度的性能上的自然提升,这也体现了Go语言在稳中求新、稳中求变的特点。

不过这里还要提醒各位Go开发者,在升级Go 1.22版本时务必注意潜在的向后兼容性问题,尤其是loopvar语义带来的变化影响。

本文涉及的源码可以在这里下载。


Gopher部落知识星球在2024年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。同时,我们也会加强代码质量和最佳实践的分享,包括如何编写简洁、可读、可测试的Go代码。此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

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

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily

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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! 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