登录
首页 >  Golang >  Go问答

`//go:build` 和 `// +build` 指令有什么区别?

来源:Golang技术栈

时间:2023-04-07 17:49:39 264浏览 收藏

一分耕耘,一分收获!既然都打开这篇《`//go:build` 和 `// +build` 指令有什么区别?》,就坚持看下去,学下去吧!本文主要会给大家讲到golang等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

例如,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

在我看来,作为构建标签,// +build ...可以很好地工作。
为什么//go:build仍然明确指定?

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

正确答案

//go:build是 Go 1.17 中引入的新条件编译指令。

它旨在替换// +build指令,因为新语法带来了一些关键改进:

  • 与其他现有的 Go 指令和 pragma 保持一致,例如//go:generate
  • 支持标准布尔表达式,例如//go:build foo && bar,而旧// +build注释的语法不太直观。例如 AND 用逗号表示// +build foo,bar,OR 用空格表示// +build foo bar
  • 它由 支持go fmt,它将自动修复指令在源文件中的不正确放置,从而避免常见错误,例如在指令和包语句之间没有留空行。

这两个构建指令 将在几个 Go 版本中共存 ,以确保顺利过渡,如相关提案文档中所述(低于 N = 17,强调我的)[:](https://go.googlesource.com/proposal/+/master/design/draft- gobuild.md#transition)

Go 1.N 将开始转换。在 Go 1.N 中:

  • 构建将开始优先//go:build选择文件行。如果//go:build文件中没有,则任何// +build行仍然适用。

  • 如果 Go 文件包含//go:build不包含// +build.

  • //go:build如果 Go 或程序集文件在文件中包含太晚,则构建将失败。Gofmt 会将错位的 //go:build 和 // +build 行移动到文件中的正确位置。

  • Gofmt将使用与其他 Go 布尔表达式(所有和运算符//go:build周围的空格)相同的规则来格式化表达式。&&``||

  • 如果文件仅包含// +build行,gofmt将在它们上方添加等效//go:build行。

  • 如果文件同时包含//go:build// +build行,gofmt将考虑//go:build事实来源并更新// +build行以匹配,保持与早期版本的 Go 的兼容性。Gofmt也会拒绝//go:build那些被认为太复杂而无法转换为// +build格式的行,尽管这种情况很少见。(请注意此项目符号开头的“泪如果”。Gofmt不会将// +build行添加到只有 .)的文件中 //go:build。)

  • buildtags签入go vet将添加对//go:build约束的支持。 当 Go 源文件包含不同含义 行时,它将失败//go:build``// +build。如果检查失败,可以运行gofmt -w.

  • 当一个 Go 源文件包含without并且其包含的模块有一个 go 行列出 Go 1.N 之前的版本时,buildtags检查也会失败。如果检查失败,可以添加任何一行然后运行,它将用正确的行替换它。或者可以将 Go 版本升级到 Go 1.N。//go:build``// +build``// +build``gofmt -w``go.mod

有关语法更改的更多信息:[Golang 条件编译](https://stackoverflow.com/questions/10646531/golang- conditional-compilation/67937234#67937234)

理论要掌握,实操不能落!以上关于《`//go:build` 和 `// +build` 指令有什么区别?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>