// +build
注释主要用于实现条件编译。借助设置不同的构建标签(build tags),我们能够指定在特定的操作系统、架构或者其他自定义条件下才编译某个文件
1、基本规则
-
格式要求:
- 这种注释必须出现在文件的开头部分。
- 注释与包声明之间至少要存在一个空行。
- 注释内容以
// +build
开头,注意+build
前面有两个斜杠,后面紧跟一个空格。
-
标签逻辑规则:
// +build 条件1 条件2
package main
- 同一行上的标签之间是 "与" 的关系,也就是所有标签都必须满足才行。(有待验证)
- 不同行的标签之间是 "或" 的关系,只要满足其中一行的所有标签即可。(有待验证)
- 可以使用
!
符号来表示取反的条件。
2、常用标签示例
// +build linux,darwin
// +build amd64
// 这个源文件只会在Linux或macOS系统的amd64架构下编译
package main
- 用 逗号 分隔同一行中的标签,表示 OR 关系 。(有待验证)
- 用 换行 分隔不同条件组,表示 AND 关系。(有待验证)
3、标签的常见应用场景
-
针对不同操作系统的代码:
// +build windows package platform func GetOS() string { return "Windows" }
-
针对不同架构的代码:
// +build arm64 package arch func GetArch() string { return "ARM64" }
-
自定义构建标签:
// +build debug package main func init() { println("Debug模式已启用") }
在编译时,可以使用
-tags
参数来启用自定义标签,例如:go build -tags "debug" main.go
或者
// +build dev
package conf
const (
// ConfigFilePath path of the configuration file
ConfigFilePath = "/conf/config_dev.conf"
Developing = true
)
在编译时执行:**go build -tags=prod ,**这样,Go 编译器会检查所有的 Go 文件,并只编译那些带有 prod
标签的带标签文件。这对于区分不同构建环境(如开发环境 dev
和生产环境 prod
)非常有用,可以让你轻松地管理不同环境下的配置和代码逻辑。
(不带构建标签的文件在默认情况下会被编译。)
4、优先级顺序
-
当存在多个标签时,它们的优先级是:与(AND)> 或(OR)> 非(NOT)。
-
示例:
// +build linux,386 darwin,!cgo
这个注释表示该文件会在以下两种情况下编译:
- 系统为 Linux 且架构为 386。
- 系统为 macOS(darwin)且未启用 cgo。
5、注意要点
-
构建标签是大小写敏感的,像
linux
和Linux
代表的是不同的标签。 -
构建标签只对
.go
文件起作用,.c
、.h
等文件不受其影响。 -
可以通过
go tool build
命令查看构建标签的处理逻辑。 -
在Go 1.17 及以后的版本中,推荐使用
//go:build
注释来替代// +build
,新的语法更加简洁明了,例如://go:build linux || darwin // +build linux darwin // 为了兼容旧版本,保留此注释 package main