//go:build
是GO 1.17中引入的新的条件编译指令.
它旨在取代// +build
条指令,因为新语法带来了一些关键改进:
- 与其他现有GO指令和指示保持一致,例如
//go:generate
- 支持标准布尔表达式,例如
//go:build foo && bar
,而旧的// +build
注释语法不太直观.例如,AND用逗号// +build foo,bar
表示,OR用空格// +build foo bar
表示
go fmt
支持它,它将自动修复源文件中指令的错误位置,因此避免了common mistakes,因为在指令和包语句之间不留空行.
为了确保平稳过渡,在几个Go版本上发布了两个构建指令will coexist,如相关提案文件中的outlined(以下N=17,重点):
Go 1.N将开始过渡.在GO 1.N中:
构建将开始优先 Select //go:build
行用于文件 Select .如果文件中没有//go:build
行,则仍然适用任何// +build
行.
如果GO文件包含//go:build
而不包含// +build
,则构建将不再失败.
如果GO或程序集文件中包含//go:build
的时间太晚,则生成将失败.Gofmt将移动位置错误//转到:Build
和//+将行构建到它们在文件中的正确位置.
Gofmt
将使用与其他Go布尔表达式相同的规则(所有&&
和||
运算符周围的空格)在//go:build
行中格式化表达式.
If a file contains only 100 lines, 101 will add an equivalent 102 line above them.
If a file contains both 100 and 101 lines, 102 will consider the 100 the source of truth,并更新// +build
行以匹配,保持与围棋早期版本的兼容性.Gofmt
还将拒绝被认为太复杂而无法转换为// +build
格式的//go:build
行,尽管这种情况很少见.(请注意此项目符号开头的"if".Gofmt
不会向只有//go:build
行的文件中添加// +build
行.)
buildtags
检入go vet
将添加对//go:build
个约束的支持.It will fail when a Go source file contains 102 and 104 lines with different meanings.如果判断失败,可以运行gofmt -w
.
如果GO源文件包含不带// +build
的//go:build
,并且其包含模块的GO行列出了GO 1.N之前的版本,则buildtags
判断也将失败.如果判断失败,可以添加任意// +build
行,然后运行gofmt -w
,这将用正确的行替换它.或者可以将go.mod
Go版本提升到1.N.
有关语法更改的更多信息:Golang conditional compilation