go:build 是 Go 1.17 版本中引入的一个构建标记,用于根据不同的条件控制代码的编译。go:build 格式如//go:build <标记表达式>, 1.17之前使用+build的方式,这里我们介绍更强大的的go:build.

表达式可以包含由 ||、&& 和 ! 运算符和括号组合的选项,含义与 Go 语言中相同.

构建约束可以出现在任何类型的源文件中(不仅仅是 Go 文件),但是它们必须出现在文件的顶部附近,仅由空行和其他行注释分隔。这些规则意味着在 Go 文件中,构建约束必须出现在包声明之前

例如,下面的构建约束将约束一个文件在满足“linux”和“386”约束条件或在满足“darwin”条件且未满足“cgo”条件时进行构建://go:build (linux && 386) || (darwin && !cgo)

自定义tag

//go:build atest

当我们使用go build -tags atest的情况下会编译此文件,否则不会编译

控制go版本

//go:build go1.17 指定当前文件>=go1.17才编译

//go:build go1.17 && go1.20 版本>= go1.17 并且<= go1.20