例如,https://github.com/golang/sys/blob/master/cpu/cpu_gccgo_x86.go#L5:

//go:build (386 || amd64 || amd64p32) && gccgo
// +build 386 amd64 amd64p32
// +build gccgo

package cpu

In my eyes, as a build tag, // +build ... can work well.
Why is //go:build still explicitly specified?

顺便说一句,//go:build的男士很难找到,但是// +build很容易(https://pkg.go.dev/cmd/go#hdr-Build_constraints)

推荐答案

//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

Go相关问答推荐

出口上下文值密钥的安全方法?

Go PQ驱动程序无法使用默认架构进行查询

如何模拟go的Elastic search SDK?

Prometheus 摘要分位数错误

Kusto Go API 从多个表查询

如何绕过深层 xml,没有嵌套循环?

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

创建新对象后如何返回嵌套实体?

regex.ReplaceAll 但如果替换则添加相同数量的字符

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

级联调用泛型函数时的泛型类型推断

如何在 GORM 中获取字段值

如何获取多个 url 参数值

即使一个测试用例失败,如何运行所有测试用例

分配空切片而不引用其类型?

Go GCP 同时模拟两个服务帐户

Go模板中的浮点除法

函数参数的判断顺序是什么?

Go/Golang:如何从 big.Float 中提取最低有效数字?

Go:如何通过 GIN-Router 从 AWS S3 将文件作为二进制流发送到浏览器?