Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐|聊聊Go 1.17版本的那些新特性

go vet工具检测
兼容性处理
语法示例
二进制文件大小变化
性能提升
go mod graph
示例结构
转换规则
安全性检查
语法示例
//go:build形式的构建约束指示符
基于寄存器的调用惯例
修剪的module依赖图
支持将切片转换为数组指针
欢迎分享
思考题内容
//go:build形式的构建约束指示符
基于寄存器的调用惯例
go get的变化
go.mod文件size的变化
修剪的module依赖图
完整module依赖图
切片转换为数组指针
Go语言设计哲学
Go编译器的变化
Go Module构建模式的变化
新的语法特性
思考题
Go编译器的变化
Go Module构建模式的变化
语法特性
新特性
加餐|聊聊Go 1.17版本的那些新特性

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
现在是 2021 年 12 月,万众期盼的潜力网红版本 Go 1.18 的开发已经冻结,Go 核心开发团队正在紧锣密鼓地修 bug。我们已经可以开始期待 2022 年的 2 月份,Go 1.18 将携带包括泛型语法的大批新特性赶来。不过当下我们不能“舍近求远”,今年 8 月中旬 Go 核心团队发布的 Go 1.17 版本才是当下最具统治力的 Go 社区网红,它的影响力依旧处于巅峰。
根据我们在第 3 讲中提到的 Go 版本选择策略,我估计很多 Go 开发者都还没切换到 Go 1.17 版本,没有亲自体验过 Go 1.17 新特性带来的变化;还有一些 Go 开发者虽然已经升级到 Go 1.17 版本,但也仅限于对 Go 1.17 版本的基本使用,可能还不是很清楚 Go 1.17 版本中究竟有哪些新特性,以及这些新特性会带给他们哪些好处。
所以今天这讲,我们就来聊聊 Go 1.17 版本中的新特性,目的是让那些没用过 Go 1.17 版本,或者用过 Go 1.17 版本但还不知道它新特性变化的 Go 开发者,对 Go 1.17 有一个全面的了解。
Go 1.17 版本中的新特性很多,在这里我就不一一列举了,我仅挑几个有代表性的、重要的新特性和你好好聊聊。这里会包括新的语法特性、Go Module 机制变化,以及 Go 编译器与运行时方面的变化。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
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-19
    2
    3
  • 言己
    性能测试示例代码,golang 的字符串拼接原来有这么多方式。

    作者回复: 是的,不同拼接方式性能差距较大。

    2021-12-17
    3
  • 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-19
    2
    2
  • 陈东
    与时俱进的一个语言。

    作者回复: 👍

    2021-12-19
    2
  • Darren
    老师,java是基于堆栈的还是基于寄存器的?我的理解好像是基于堆栈的😂,但不知道是否正确

    作者回复: 对java了解不多,不同jvm可能情况不一,有的基于寄存器,有的基于堆栈。

    2021-12-18
    2
  • 在下宝龙、
    老师您好,我最近使用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-17
    2
  • 大尾巴老猫
    后续是否会讲解如何搭建一套私有的开发环境?企业级应用开发,通常有一些安全合规相关的要求,使用go mod,不太可能直接从github或者gitee上引用,私有代码库通常也是需要身份验证的,这种情况下如何使用go get?

    作者回复: 有一篇规划好的加餐是讲解这方面的内容的,敬请期待:)

    2021-12-21
    1
  • 无名无姓
    go 1.18版本的泛型还是比较让人期待的

    作者回复: go 1.18beta1已经发布,如果感兴趣,可以去下载体验一下。https://go.dev/dl

    2021-12-19
    2
    1
  • 陈东
    按第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-18
    2
    1
  • 功夫熊猫
    我已经被go mod的本地包的引入方式难受死了,为了能引入本地包,我不得不把我的代码提前上传到码云。

    作者回复: go 1.18版本之前用replace也是可以的,就是手工操作go.mod比较多。go 1.18后用go.work机制就方便了。

    2021-12-17
    1
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部