Go语言提供的build tag 条件编译特性,顾名思义,只有在特定条件下才会构建对应的代码。
比如下面的源文件只有在设置debug构建标志时才会被构建:
// +build debugpackage mainvar buildMode = "debug"
可以用以下命令构建:
go build -tags="debug"
go build -tags="windows debug"
关于tags的说明:
- 构建约束以一行
+build
开始的注释。在+build
之后列出了一些条件,在这些条件成立时,该文件应包含在编译的包中; - 约束可以出现在任何源文件中,不限于go文件;
+build
必须出现在package
语句之前,+build
注释之后应要有一个空行。- 多个条件之间,空格表示OR;逗号表示AND;叹号(!)表示NOT
- 一个文件可以有多个+build,它们之间的关系是AND。
例如:
我们可以通过-tags
命令行参数同时指定多个build标志,它们之间用空格分隔。
当有多个build tag时,我们将多个标志通过逻辑操作的规则来组合使用。比如以下的构建标志表示只有在”linux/386“或”darwin平台下非cgo环境“才进行构建。
// +build linux,386 darwin,!cgo
// +build windows
其中linux,386
中linux和386用逗号连接表示AND的意思;
而linux,386
和darwin,!cgo
之间通过空白分割来表示OR的意思;
两行语句表示AND。
tags 应用场景:
不同环境下编译不同的文件,实现版本控制 、 环境配置控制等。
例如:项目中有如下文件代表不同的运行环境,通过 tag 控制不同环境下要编译的文件
dev.go
// +build devpackage mainimport "fmt"var version = "dev"func main() {fmt.Printf("running %s version", version)
}
release.go
// +build releasepackage mainimport "fmt"var version = "release"func main() {fmt.Printf("running %s version", version)
}
编译时通过指定不同的标签来编译不同文件:
编译 dev 环境
go build -tags="dev"
编译 release 环境
go build -tags="release"
来思Go,Let's Go!欢迎留言交流学习!