go编译标签build tag注释里语法详解
作者:海生
一、介绍
在Go中,build tag是添加到我们的代码中第一行,来标识编译相关的信息。
其决定了当前文件是否会被当前 package 所包含。
用于限制一整个文件是否应该被编译入最终的二进制文件,而不是一个文件中的部分代码片段
go 编译标签(build tag)语法如下:
// +build [tag]
- Build tags文件顶部附近,前面只能有空行和其他行注释。
- 编译标记必须出现在 package 子句之前,并且为了与包文档区分开来,它必须后跟一个空行。
二、编译标签(build tag)的bool逻辑
当我们在一个包中使用多个标签时,它们会使用布尔逻辑进行交互,具体取决于我们如何进行声明。
Build tags遵循以下三个规则:
- 以空格分隔的标签将在 OR 逻辑下进行解释。
- 逗号分隔的标签将在 AND 逻辑下进行解释。
- 每个术语都是一个字母数字单词,如果前面有! 它意味着它被否定。
2.1、or标签逻辑
给定标签:
// +build tag1 tag2
OR解释是,如果在执行build构建命令时存在tag1 或 tag2,则将包含此文件。
2.2、and标签逻辑
如果我们使用标签:
// +build tag1, tag2
解释是 tag1 且(AND) tag2 必须存在于build构建命令中,我们的文件才能包含在编译中。
2.3、!(非标签逻辑)
如果我们使用标签
// +build !tag1
解释是,非tag1,我们的文件才会build编译
三、如何使用
3.1 新建build tag
我们新建一个 buildtag 文件夹,并在文件夹下新建如下4个空文件。
. ├── dev.go ├── main.go ├── prod.go └── test.go
我们打开main.go 输入代码如下:
package main import "fmt" var configArr []string func main() { for _, conf := range configArr { fmt.Println(conf) } }
我们打开dev.go 输入代码如下:
// +build dev package main func init() { configArr = append(configArr, "mysql dev") }
我们打开prod.go 输入代码如下:
// +build prod package main func init() { configArr = append(configArr, "mysql prod") }
我们打开test.go 输入代码如下:
// +build test1 package main func init() { configArr = append(configArr, "mysql test") }
3.2 使用 tags 编译
3.2.1 简单使用单个tag编译
我们使用
go build -tags "dev"
在文件夹里生成了二进制执行文件 buildtag
我们执行一下:
➜ ./buildtag
输出:
mysql dev
3.2.2 多个关系编译
我们使用
go build -tags "dev prod"
在文件夹里生成了二进制执行文件 buildtag
我们执行一下:
➜ ./buildtag
输出:
mysql dev
mysql prod
四、go:build 与 +build 的区别
//go:build
是 Go 1.17 中引入的新条件编译指令格式。它旨在替换
// +build
指令。为何要采用新的格式呢?
对比一下新旧格式的区别就知道了:
// go:build linux && amd64 || darwin // +build linux,amd64 darwin
显而易见的优势:
go:build 这种格式,对 coder 来说,更容易理解其逻辑组合与 //go:embed 和 //go:generate 这些命令相比较,格式上进行了统一
其他的学习资料
以上就是go编译标签build tag注释里语法详解的详细内容,更多关于go编译标签build tag注释语法的资料请关注脚本之家其它相关文章!