go编译标签build tag注释里语法详解

 更新时间:2023年09月05日 15:09:32   作者:海生  
这篇文章主要为大家介绍了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 这些命令相比较,格式上进行了统一

其他的学习资料

gin通过go build -tags实现json包的切换

以上就是go编译标签build tag注释里语法详解的详细内容,更多关于go编译标签build tag注释语法的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言结构体的使用小结

    Go语言结构体的使用小结

    在Go语言中,结构体是一种自定义的数据类型,它包含了一系列命名的数据字段, 下面就来详细的介绍一下Go语言结构体的使用,感兴趣的可以了解一下
    2025-12-12
  • Golang共享变量如何解决问题

    Golang共享变量如何解决问题

    协程之间的通信只能够通过通道。但是我们习惯于共享变量,而且很多时候使用共享变量能让代码更简洁。那么Golang共享变量如何解决问题,感兴趣的可以了解一下
    2021-12-12
  • Golang中由零值和gob库特性引起BUG解析

    Golang中由零值和gob库特性引起BUG解析

    这篇文章主要为大家介绍了Golang中由零值和gob库特性引起BUG解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Go语言对JSON进行编码和解码的方法

    Go语言对JSON进行编码和解码的方法

    这篇文章主要介绍了Go语言对JSON进行编码和解码的方法,涉及Go语言操作json的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go语言反射获取类型属性和方法示例

    Go语言反射获取类型属性和方法示例

    这篇文章主要为大家介绍了本文将介绍 Go 反射 reflect.StructField 和 reflect.Method 相关的内容,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang WebView跨平台的桌面应用库的使用

    Golang WebView跨平台的桌面应用库的使用

    Golang WebView是一个强大的桌面应用库,本文介绍了Golang WebView的特点和使用方法,并列举示例详细的介绍了其在实际项目中的应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • go语言中Timer和Ticker两种计时器的使用

    go语言中Timer和Ticker两种计时器的使用

    go语言中有Timer和Ticker这样的两种计时器,两种计时器分别实现了不同的计时功能,本文主要介绍了go语言中Timer和Ticker两种计时器的使用,感兴趣的可以了解一下
    2024-08-08
  • Go高级特性探究之稳定排序详解

    Go高级特性探究之稳定排序详解

    Go 语言提供了 sort 包,其中最常用的一种是 sort.Slice() 函数,本篇文章将为大家介绍如何使用 sort.SliceStable() 对结构体数组的某个字段进行稳定排序,感兴趣的可以了解一下
    2023-06-06
  • Go语言中反射的实现

    Go语言中反射的实现

    反射是Go语言中一个强大的特性,本文就来详细的介绍一下反射的使用,具有一定的参考价值,感兴趣的可以了解一下
    2026-04-04
  • Go互斥锁和读写锁完整代码举例

    Go互斥锁和读写锁完整代码举例

    读写锁(sync.RWMutex)与互斥锁(sync.Mutex)是Go语言中两种最核心的并发控制机制,本质区别在于对读操作的并发支持,这篇文章主要介绍了Go互斥锁和读写锁的相关资料,需要的朋友可以参考下
    2026-06-06

最新评论