Go 1.19 要来了,看看都有哪些变动
前言
Go 官网团队在 2022.06.11 公布了 Go 1.19 Beta 1 版本,Go 1.19 的正式 release 版本预计会在往年 8 月份公布。
让咱们先睹为快,看看 Go 1.19 给咱们带来了哪些变动。
这是 Go 1.19 版本更新内容详解的第 2 篇,欢送大家关注公众号,及时获取本系列最新更新。
Go 1.19 公布清单
和 Go 1.18 相比,改变绝对较小,次要波及语言 (Language)、内存模型(Memory Model)、可移植性(Ports)、Go Tool 工具链、运行时(Runtime)、编译器(Compiler)、汇编器(Assembler)、链接器(Linker) 和外围库 (Core library) 等方面的优化。
第 1 篇具体介绍了 Go 1.19 在语言、内存模型、可移植性方面的改良。
本文重点介绍 Go 1.19 版本在 Go Tool 工具链方面的变动。
文档正文
文档正文 (doc comments) 是 Go 语言里的对包(package), 常量(const), 函数(func), 类型(type) 和变量 (var) 申明的一种正文标准。依照这个标准来正文,就能够应用 go doc
命令生成对应的代码阐明文档。
像大家熟知的 https://pkg.go.dev/ 里的阐明文档就是通过编写合乎 doc comments 标准的文档正文来生成的。
Go 1.19 在文档正文里新增了对于链接、列表和更清晰的题目的反对,能够参考“Go Doc Comments”理解语法细节。
作为这个批改的一部分,gofmt
当初会把文档正文从新格式化,让文档款式展现更清晰。
同时,新增了一个 package: go/doc/comment,能够用于解析和从新格式化文档正文,并且反对把文档正文渲染为 HTML, Markdown 和 text 格局。
新的编译束缚 unix
Go 语言反对应用编译束缚 (build constraint) 进行条件编译。Go 1.19 版本新增了编译束缚 unix
,能够在 //go:build
前面应用unix
。
//go:build unix
unix
示意编译的指标操作系统是 Unix 或者类 Unix 零碎。对于 Go 1.19 版本而言,如果 GOOS
是 aix
, android
, darwin
, dragonfly
, freebsd
, hurd
, illumos
, ios
, linux
, netbsd
, openbsd
, 或 solaris
中的某一个,那就满足 unix
这个编译束缚。
将来 unix
束缚还会匹配一些新的类 Unix 操作系统。
Go 命令
go build
如果应用 -trimpath
标记,会在生成的可执行文件里打上 trimpath
标签,咱们能够应用 go
version
-m
或 debug.ReadBuildInfo
查看可执行文件是否是应用-trimpath
标记编译生成的。
备注 :编译的时候带上trimpath
标记能够去除 Go 程序运行时打印的堆栈信息里蕴含的 Go 程序的编译门路和编译机用户信息,防止信息泄露。
go
generate
当初会在生成器环境里设置 GOROOT
环境变量,所以即便应用了 -trimpath
进行编译,生成器也能够精准定位到 GOROOT
的门路。
go
test
和 go
generate
运行时会把 GOROOT/bin
放在 PATH
环境变量的结尾,这样设计后,go test
和 go generate
执行的时候能够解析到同一个GOROOT
。解决的是这个 GitHub Issue。
go
env
会把环境变量的值中带有空格的加上双引号括起来,包含CGO_CFLAGS
, CGO_CPPFLAGS
, CGO_CXXFLAGS
, CGO_FFLAGS
, CGO_LDFLAGS
, and GOGCCFLAGS
这些环境变量。解决的是 Windows 环境下不带空格会报错的 bug,详情能够参考 GitHub Issue。
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""CGO_CXXFLAGS="-g -O2"CGO_FFLAGS="-g -O2"CGO_LDFLAGS="-g -O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/pv/_x849j6n22x37xxd9cstgwkr0000gn/T/go-build4165054210=/tmp/go-build -gno-record-gcc-switches -fno-common"
go
命令当初会缓存必要的信息用于加载模块 (module),这会带来go list
调用的减速。
对 -trimpath
和go generate
不理解的,举荐浏览官网文档:
- trimpath and go generate
- go generate 介绍
Vet
go vet
新增了一个 errorsas
查看规定,能够对 errors.As
函数调用进行正确性查看。
如果 errors.As
的第 2 个参数是 *error
类型,go vet
会提醒谬误,这也是大家应用 errors.As
常犯的一个谬误。
举荐浏览
Go 1.19 版本变更内容第 1 篇,第 1 篇次要波及到 Go 泛型的细小改变以及 Go 内存模型和原子操作的优化。
想理解 Go 泛型的应用办法、设计思路和最佳实际,举荐大家浏览:
- 官网教程:Go 泛型入门
- 一文读懂 Go 泛型设计和应用场景
- 重磅:Go 1.18 将移除用于泛型的 constraints 包
- 泛型最佳实际:Go 泛型设计者教你如何用泛型
想理解 Go 原子操作和应用办法,举荐大家浏览:
- Go 并发编程之原子操作 sync/atomic
总结
下一篇会介绍 Go 1.19 在运行时、编译器、汇编器、链接器和外围库的优化工作,有一些内容值得学习,欢送大家放弃关注。
开源地址
文章和示例代码开源在 GitHub: Go 语言高级、中级和高级教程。
公众号:coding 进阶。关注公众号能够获取最新 Go 面试题和技术栈。
集体网站:Jincheng’s Blog。
知乎:无忌。
福利
我为大家整顿了一份后端开发学习材料礼包,蕴含编程语言入门到进阶常识(Go、C++、Python)、后端开发技术栈、面试题等。
关注公众号「coding 进阶」,发送音讯 backend 支付材料礼包,这份材料会不定期更新,退出我感觉有价值的材料。还能够发送音讯「进群」,和同行一起交流学习,答疑解惑。
References
- https://tip.golang.org/doc/go…
- https://tip.golang.org/doc/co…