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版本而言,如果GOOSaix, android, darwin, dragonfly, freebsd, hurd, illumos, ios, linux, netbsd, openbsd, 或 solaris中的某一个,那就满足unix这个编译束缚。

将来unix束缚还会匹配一些新的类Unix操作系统。

Go命令

go build如果应用-trimpath标记,会在生成的可执行文件里打上trimpath标签,咱们能够应用 go version -mdebug.ReadBuildInfo 查看可执行文件是否是应用-trimpath标记编译生成的。

备注:编译的时候带上trimpath标记能够去除Go程序运行时打印的堆栈信息里蕴含的Go程序的编译门路和编译机用户信息,防止信息泄露。

go generate 当初会在生成器环境里设置 GOROOT 环境变量,所以即便应用了-trimpath进行编译,生成器也能够精准定位到GOROOT的门路。

go testgo generate 运行时会把 GOROOT/bin 放在 PATH 环境变量的结尾,这样设计后,go testgo 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调用的减速。

-trimpathgo 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...