golang中有两种使用条件编译的方式,一种是通过文件名的 命名规则,另一种则是注释,一种特别的 标签注释。
命名规则
* _GOOS* _GOARCH* _GOOS_GOARCH
注意: 命名的顺序。GOOS_GOARCH是可以的,但是GOARCH_GOOS不行
比如我们自定义config_linux_amd64.go 那么就会在linux平台,64位架构的cpu下编译。不满足条件的文件将被忽略,即使文件有错误,可以不会影响其他文件的正常编译。
标签注释
// +build linux,cgo darwin,cgo
注意编译标签注释 如果不是写在源码文件的第一行的话,需要上下空一行,与正常的注释和代码隔开,不然的话,编译器会忽略,无法识别。
编译标签注释之间也会有逻辑运算,对应关系如下
- 空格 OR
- 逗号 AND
- 感叹号 NOT
- 换行 AND
示例:
// +build linux,386 darwin,!cgo# 对应的逻辑运算:(linux AND 386) OR (darwin AND (NOT cgo))linux 32位,或者 darwin关闭cgo// +build linux darwin// +build 386# 对应的逻辑运算:(linux OR darwin) AND 386linux或darwin的32位
自定义标签
创建文件如下:
.├── config│ ├── config_dev.go│ └── config_prod.go└── main.go
config_prod.go
//+build prodpackage configvar String = "this is prod mode"var String2 = "prod test"func Config() string {return String2}
config_dev.go
//+build devpackage configvar String1 = "this is debug mode"var String2 = "debug test"func Config() string {return String2}
main.go
package mainimport ("config""fmt")func main() {fmt.Println("this build is: ", config.String1, config.String2, config.Config())}
编译:
# 编译(-o 指定编译后生成的可执行文件名)go build -tags prod -o main# 运行./main# 输出结果this build is: this is prod mode prod test prod test
注: goland报错
点击编辑:

