Go 1.17rc1在前几天正式发布:
时隔三年,GO1.17终于增加了新特性,是面向Go构建的时候构建约束增强。
很多人初学或者使用Go语言的时候压根不知道Go有个约束语法,以为只是个注释问题。其实Go语言在不同的编译环境要写不同的Go代码,所以需要构建约束。Go语言针对这一问题的解决方案是在文件层面进行有条件的编译,要么每个文件在编译中要么就不在。
构建约束(build constraint),也叫做构建标记(build tag),是在 Go 源文件最开始的注释行,比如:
// +build linux
看到这个,相信很多人都不陌生,因为这是 Go 一开始就有的特性,在 Go 源码中有很多这样的注释行。上面注释行的意思,这个文件只在 Linux 系统会包含在包中,其他系统会忽略这个文件。
几个注意点:
- 约束可以出现在任何源文件中,比如 .go、.s 等;
- 必须在文件顶部附近,它的前面只能有空行或其他注释行;可见包子狗也在约束之后;
- 约束可以有多行;
- 为了区别约束和包文档,在约束之后必须有空行;
针对某个构建约束,可使用的词如下:
- 特定操作系统,对应 runtime.GOOS 的可用值,比如 linux、windows 等;
- 特定的架构,对应 runtime.GOARCH 的可用值,比如 386、amd64 等;
- 使用的编译器,比如 gc、gccgo;
- 支持 cgo 命令时,可以使用 cgo;
- Go 的主要发布版本,比如 go1.17、go1.16 等;(测试版本和 fixbug 版本不支持)
- 自定义的 tag,编译时通过 -tags 传递的值;
- 可以加入任意值,一般用 ignore 来忽略构建;
此外,文件名可以通过 GOOS 和 GOARCH 来做构建约束。