go編譯標(biāo)簽build?tag注釋里語(yǔ)法詳解
一、介紹
在Go中,build tag是添加到我們的代碼中第一行,來(lái)標(biāo)識(shí)編譯相關(guān)的信息。
其決定了當(dāng)前文件是否會(huì)被當(dāng)前 package 所包含。
用于限制一整個(gè)文件是否應(yīng)該被編譯入最終的二進(jìn)制文件,而不是一個(gè)文件中的部分代碼片段
go 編譯標(biāo)簽(build tag)語(yǔ)法如下:
// +build [tag]
- Build tags文件頂部附近,前面只能有空行和其他行注釋。
- 編譯標(biāo)記必須出現(xiàn)在 package 子句之前,并且為了與包文檔區(qū)分開(kāi)來(lái),它必須后跟一個(gè)空行。
二、編譯標(biāo)簽(build tag)的bool邏輯
當(dāng)我們?cè)谝粋€(gè)包中使用多個(gè)標(biāo)簽時(shí),它們會(huì)使用布爾邏輯進(jìn)行交互,具體取決于我們?nèi)绾芜M(jìn)行聲明。
Build tags遵循以下三個(gè)規(guī)則:
- 以空格分隔的標(biāo)簽將在 OR 邏輯下進(jìn)行解釋。
- 逗號(hào)分隔的標(biāo)簽將在 AND 邏輯下進(jìn)行解釋。
- 每個(gè)術(shù)語(yǔ)都是一個(gè)字母數(shù)字單詞,如果前面有! 它意味著它被否定。
2.1、or標(biāo)簽邏輯
給定標(biāo)簽:
// +build tag1 tag2
OR解釋是,如果在執(zhí)行build構(gòu)建命令時(shí)存在tag1 或 tag2,則將包含此文件。
2.2、and標(biāo)簽邏輯
如果我們使用標(biāo)簽:
// +build tag1, tag2
解釋是 tag1 且(AND) tag2 必須存在于build構(gòu)建命令中,我們的文件才能包含在編譯中。
2.3、!(非標(biāo)簽邏輯)
如果我們使用標(biāo)簽
// +build !tag1
解釋是,非tag1,我們的文件才會(huì)build編譯
三、如何使用
3.1 新建build tag
我們新建一個(gè) buildtag 文件夾,并在文件夾下新建如下4個(gè)空文件。
. ├── dev.go ├── main.go ├── prod.go └── test.go
我們打開(kāi)main.go 輸入代碼如下:
package main import "fmt" var configArr []string func main() { for _, conf := range configArr { fmt.Println(conf) } }
我們打開(kāi)dev.go 輸入代碼如下:
// +build dev package main func init() { configArr = append(configArr, "mysql dev") }
我們打開(kāi)prod.go 輸入代碼如下:
// +build prod package main func init() { configArr = append(configArr, "mysql prod") }
我們打開(kāi)test.go 輸入代碼如下:
// +build test1 package main func init() { configArr = append(configArr, "mysql test") }
3.2 使用 tags 編譯
3.2.1 簡(jiǎn)單使用單個(gè)tag編譯
我們使用
go build -tags "dev"
在文件夾里生成了二進(jìn)制執(zhí)行文件 buildtag
我們執(zhí)行一下:
? ./buildtag
輸出:
mysql dev
3.2.2 多個(gè)關(guān)系編譯
我們使用
go build -tags "dev prod"
在文件夾里生成了二進(jìn)制執(zhí)行文件 buildtag
我們執(zhí)行一下:
? ./buildtag
輸出:
mysql dev
mysql prod
四、go:build 與 +build 的區(qū)別
//go:build
是 Go 1.17 中引入的新條件編譯指令格式。它旨在替換
// +build
指令。為何要采用新的格式呢?
對(duì)比一下新舊格式的區(qū)別就知道了:
// go:build linux && amd64 || darwin // +build linux,amd64 darwin
顯而易見(jiàn)的優(yōu)勢(shì):
go:build 這種格式,對(duì) coder 來(lái)說(shuō),更容易理解其邏輯組合與 //go:embed 和 //go:generate 這些命令相比較,格式上進(jìn)行了統(tǒng)一
其他的學(xué)習(xí)資料
gin通過(guò)go build -tags實(shí)現(xiàn)json包的切換
以上就是go編譯標(biāo)簽build tag注釋里語(yǔ)法詳解的詳細(xì)內(nèi)容,更多關(guān)于go編譯標(biāo)簽build tag注釋語(yǔ)法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang信號(hào)量設(shè)計(jì)實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Golang信號(hào)量設(shè)計(jì)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08go編程中g(shù)o-sql-driver的離奇bug解決記錄分析
這篇文章主要為大家介紹了go編程中g(shù)o-sql-driver的離奇bug解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Golang中的time.Duration類型用法說(shuō)明
這篇文章主要介紹了Golang中的time.Duration類型用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法
這篇文章主要介紹了Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法,涉及Go語(yǔ)言指針及結(jié)構(gòu)體的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Golang基礎(chǔ)常識(shí)性面試中常見(jiàn)的六大陷阱及應(yīng)對(duì)技巧總結(jié)
Go是一門簡(jiǎn)單有趣的語(yǔ)言,但與其他語(yǔ)言類似,它會(huì)有一些技巧,這篇文章主要給大家介紹了關(guān)于Golang基礎(chǔ)常識(shí)性面試中常見(jiàn)的六大陷阱及應(yīng)對(duì)技巧的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08Go語(yǔ)言規(guī)范context?類型的key用法示例解析
這篇文章主要為大家介紹了Go語(yǔ)言規(guī)范context?類型的key用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn)
本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05go語(yǔ)言算法題解二叉樹(shù)的拷貝、鏡像和對(duì)稱
這篇文章主要為大家詳細(xì)介紹了go語(yǔ)言算法題解二叉樹(shù)的拷貝、鏡像和對(duì)稱,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01