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 386
linux或darwin的32位
自定义标签
创建文件如下:
.
├── config
│ ├── config_dev.go
│ └── config_prod.go
└── main.go
config_prod.go
//+build prod
package config
var String = "this is prod mode"
var String2 = "prod test"
func Config() string {
return String2
}
config_dev.go
//+build dev
package config
var String1 = "this is debug mode"
var String2 = "debug test"
func Config() string {
return String2
}
main.go
package main
import (
"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报错
点击编辑: