Golang 编译约束/条件编译 ( // +build [tags] )
通常对程序进行编译的时候,可能带一些条件(如不同平台、架构有不同的代码实现),让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译。golang中,称之为编译约束,进行编译约束的方式有2种分别:
- 编译标签(build tag)
- 文件后缀
编译标签 (build tag)
在源码文件顶部添加注释,来决定文件是否参与编译
+build [tags]
说明:
- 以空格分开表示AND
- 以逗号分开表示OR
- !表示NOT
标签可以指定为以下内容:
- 操作系统,环境变量中GOOS的值,如:linux、darwin、windows等等。可以通过 go env 查看 GOOS 环境变量的值。
- 操作系统的架构,环境变量中GOARCH的值,如:arch64、x86、i386等等。可以通过 go env 查看 GOARCH 环境变量的值。
- 使用的编译器,gc或者gccgo。
- 是否开启CGO,cgo。
- golang版本号: 比如Go Version 1.1为go1.1,Go Version 1.12版本为go1.12,以此类推。
- 其它自定义标签,通过go build -tags指定的值。
例如,编译条件为(linux AND 386) OR (darwin AND (NOT cgo))
// +build linux,386 darwin,!cgo
另外一个文件可以有多个编译约束,比如条件为(linux OR darwin) AND amd64
// +build linux darwin
// +build amd64
也可以将一个文件从编译中排除,使用ignore标签。
// +build ignore
注意:// +build的下一行必须是空行。(可以理解和代码之前空一行。)
// +build linux
// main package comment package main 下面的写法不会识别为build tag,而会解析为包注释:
// +build linux package main