大家好,我是炸鱼。这个周末在学习的时候,看到了Go团队的负责人RussCox(以下简称rsc)最近的分享《GopherCon 2022: Russ Cox - Compatibility: How Go Programs Keep Working[1]》,里面谈到了Go在兼容性方面存在的问题和思考,埋下了一个新期待。如下图所示:他提出了一个新的Slogan:“Goisboring,andthat'sgood”。(Go很无聊,这很好。)原因是无聊代表稳定。无聊意味着你可以专注于你的工作,而不是我们的。Go团队的核心是希望Go足够简洁。Gophers不应该把所有的时间都花在思考Go的巧妙思想上,而应该专注于自己的工作而不是他们。一开始听着有点道理,有点自己的想法,但是听了这车,就停不下来了。最后,rsc突然官宣:不会有Go2,会一直维护Go1,并且会加倍投入在Go1兼容的建设上,这会很有价值。如下图所示:当然,他也说狭义的Go2可能已经发生了,只是慢慢转移到Go1的新特性上,融入了Go。(真想说版本号还是Go1,好主意。。。)最重要的是,那些不兼容的“新”东西怎么办?大方向的大动作在之前的文章《??加大力度!Go 将会增强 Go1 向后兼容性??》中已经介绍过了。核心之一:使用Go项目中go.mod文件中的go版本号来控制编译的选择。决定了每个库在不同的Go版本下以不同的方式应用它的特性,这会影响编译时的决定。如下图所示:主模块:声明go版本为1.19,他可以使用泛型和带下划线的数字。模块Av1.0.0:声明go版本为1.17,模块A中的包不能使用泛型(1.18才支持),带下划线的数字可以正常使用。ModuleBv1.2.1:声明go版本为1.12,两者都不能使用。在上面的描述中,主模块、模块A、模块B根据go.mod中的go版本号分别应用于不同的可用特性(有的可以使用泛型,有的不能使用带下划线的数字,有的不能使用,ETC。)。其实质就是结合Gomodules原有的依赖管理逻辑,然后针对不同版本的不同特性复用go.mod的go版本号,完成编译控制逻辑。以后不会有Go2,会有Go1.x。我找到了各种可以塞进去的位置。
