加餐|聊聊Go 1.17版本的那些新特性
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
Go 1.17版本带来了许多重要的变化,其中最显著的是对语法特性的增强。新版本中,Go语言开始支持将切片转换为数组指针,这将使开发者更方便地进行数据操作。此外,Go Module构建模式也有所改变,引入了修剪的module依赖图,避免了下载或阅读不必要的go.mod文件,从而节省了开发时间。另外,Go 1.17版本中的go get已经不再用来安装命令的可执行文件,而是需要使用go install。Go编译器的变化主要体现在AMD64架构下实现了基于寄存器的调用惯例,以及新引入了//go:build形式的构建约束指示符。这些变化对于想要了解Go语言最新发展的开发者来说是非常有价值。在Go 1.17中,基于寄存器的调用惯例带来了约5%的性能提升和约2%的二进制文件大小减少。此外,引入了//go:build形式的构建约束指示符,取代了原先易错的// +build形式,使构建约束更加直观和易于理解。总的来说,Go 1.17版本的变化都在Go1兼容性的承诺范围内,保持了向后兼容的原则。这些变化使得开发者有了更好的开发体验,也让人对Go 1.17版本充满期待。
《Tony Bai · Go 语言第一课》,新⼈⾸单¥59
全部留言(12)
- 最新
- 精选
- 木木老师您好,我也想跑一下您的这个benchmark测试代码,请问文中的代码是完整代码么?以及go test -bench . 中的“-bench .”是什么意思?
作者回复: 除了包名与import之外,是完整源码。go test -bench .就是执行当前目录下的所有benchmark test的意思。
2021-12-1923 - 言己性能测试示例代码,golang 的字符串拼接原来有这么多方式。
作者回复: 是的,不同拼接方式性能差距较大。
2021-12-173 - lesserror看了大白老师的这节课后,马上升级到了1.17版本。 1. 我是直接下载macOS的pkg安装包覆盖原来安装的,之前的版本也是这么安装的,请问老师,这么操作在Mac上面,属于比较通用的升级方式吗? 2. 另外文中这这句话:“并指定一些寄存器为调用保存寄存器,允许函数在不同的调用中保持状态。” 能展开说一下不,没太明白这句话? 2. “或者依赖一些像比较函数代码指针的未公开的行为。” 能详细说一下什么是未公开的行为呢? 3. 我是直接修改go.mod中的go 版本为:go 1.15,然后执行本课程之前讲的在本地安装多个go版本的go 1.15.13 版本的测试命令: go1.15.13 test -bench . 发现比1.17版本耗时增加很多。 请问老师,我的这个测试方式是正确的么? ps: go module 的变更那里,需要先 执行go install golang.org/x/exp/cmd/txtar@latest 安装txtar工具。
作者回复: 1. 可以的。应该是mac上最常用的安装和升级方式 2. 关于基于寄存器调用的ABI方面的内容很多,很难理解,有兴趣的话,建议找一篇专门的资料看看吧。 3. 有一些go包为了提升性能等原因,通过hack go runtime使用一些unsafe的方法或汇编代码进行不安全操作,这些操作是与ABI的实现相关的,是基于之前的基于栈调用约定的,go1.17改为基于寄存器调用的约定后,这些操作就不再适用了,很可能会出错。 4. 正确 txtar工具的确需要安装,感谢提醒。
2021-12-1922 - 陈东与时俱进的一个语言。
作者回复: 👍
2021-12-192 - Darren老师,java是基于堆栈的还是基于寄存器的?我的理解好像是基于堆栈的😂,但不知道是否正确
作者回复: 对java了解不多,不同jvm可能情况不一,有的基于寄存器,有的基于堆栈。
2021-12-182 - 在下宝龙、老师您好,我最近使用go mod tidy 发现并不能很好的生效,使用之后 go mod文件并没有增加出自己想要的包信息,给我的提示是这个,我尝试去理解并没有找到答案- =,我的go版本是1.17 To upgrade to the versions selected by go 1.16: go mod tidy -go=1.16 && go mod tidy -go=1.17 If reproducibility with go 1.16 is not needed: go mod tidy -compat=1.17
作者回复: 因为你的go.mod中go的version为go 1.16。go 1.17考虑到兼容性,给你几个提示。按提示执行就好。
2021-12-172 - 大尾巴老猫后续是否会讲解如何搭建一套私有的开发环境?企业级应用开发,通常有一些安全合规相关的要求,使用go mod,不太可能直接从github或者gitee上引用,私有代码库通常也是需要身份验证的,这种情况下如何使用go get?
作者回复: 有一篇规划好的加餐是讲解这方面的内容的,敬请期待:)
2021-12-211 - 无名无姓go 1.18版本的泛型还是比较让人期待的
作者回复: go 1.18beta1已经发布,如果感兴趣,可以去下载体验一下。https://go.dev/dl
2021-12-1921 - 陈东按第7讲的第一段代码,能go run代码,但是logrus.Println 一直显示红色报错,尝试很多办法,解决 go构建约束问题,Build constraints exclude all Go files in c:src下代码目录文件夹? 尝试以下办法解决不了 1、searcheverything 搜索后删除所有包, $GOPATH目录下,把对应的包删除,重新go get,还是不行. 2、go get -u -v github.com/karalabe/xgo 3、Right click -> Mark folder as not excluded. 4、引用包报错,重启电脑,查看goproxy配置,还不行重装goland,还是IDE,引用的github.com/sirupsen/logrus红色下画波浪线,和logrus.Println红色报错 怎么解决,寻求老师帮助,谢谢。
作者回复: 用的go 1.17么?为啥要执行go get -u -v github.com/karalabe/xgo ?这是什么包?谁依赖的?
2021-12-1821 - 功夫熊猫我已经被go mod的本地包的引入方式难受死了,为了能引入本地包,我不得不把我的代码提前上传到码云。
作者回复: go 1.18版本之前用replace也是可以的,就是手工操作go.mod比较多。go 1.18后用go.work机制就方便了。
2021-12-171