golang中有两种使用条件编译的方式,一种是通过文件名的 命名规则,另一种则是注释,一种特别的 标签注释

命名规则

  1. * _GOOS
  2. * _GOARCH
  3. * _GOOS_GOARCH

注意: 命名的顺序。GOOS_GOARCH是可以的,但是GOARCH_GOOS不行

比如我们自定义config_linux_amd64.go 那么就会在linux平台,64位架构的cpu下编译。不满足条件的文件将被忽略,即使文件有错误,可以不会影响其他文件的正常编译。

标签注释

// +build linux,cgo darwin,cgo

注意编译标签注释 如果不是写在源码文件的第一行的话,需要上下空一行,与正常的注释和代码隔开,不然的话,编译器会忽略,无法识别。

编译标签注释之间也会有逻辑运算,对应关系如下

  • 空格 OR
  • 逗号 AND
  • 感叹号 NOT
  • 换行 AND


示例:

  1. // +build linux,386 darwin,!cgo
  2. # 对应的逻辑运算:
  3. (linux AND 386) OR (darwin AND (NOT cgo))
  4. linux 32位,或者 darwin关闭cgo
  5. // +build linux darwin
  6. // +build 386
  7. # 对应的逻辑运算:
  8. (linux OR darwin) AND 386
  9. linuxdarwin32

自定义标签

创建文件如下:

  1. .
  2. ├── config
  3. ├── config_dev.go
  4. └── config_prod.go
  5. └── main.go

config_prod.go

  1. //+build prod
  2. package config
  3. var String = "this is prod mode"
  4. var String2 = "prod test"
  5. func Config() string {
  6. return String2
  7. }

config_dev.go

  1. //+build dev
  2. package config
  3. var String1 = "this is debug mode"
  4. var String2 = "debug test"
  5. func Config() string {
  6. return String2
  7. }

main.go

  1. package main
  2. import (
  3. "config"
  4. "fmt"
  5. )
  6. func main() {
  7. fmt.Println("this build is: ", config.String1, config.String2, config.Config())
  8. }

编译:

  1. # 编译(-o 指定编译后生成的可执行文件名)
  2. go build -tags prod -o main
  3. # 运行
  4. ./main
  5. # 输出结果
  6. this build is: this is prod mode prod test prod test

注: goland报错
image.png
点击编辑:
image.png
image.png

参考:
https://zhuanlan.zhihu.com/p/92235251