go編譯標簽build?tag注釋里語法詳解
一、介紹
在Go中,build tag是添加到我們的代碼中第一行,來標識編譯相關的信息。
其決定了當前文件是否會被當前 package 所包含。
用于限制一整個文件是否應該被編譯入最終的二進制文件,而不是一個文件中的部分代碼片段
go 編譯標簽(build tag)語法如下:
// +build [tag]
- Build tags文件頂部附近,前面只能有空行和其他行注釋。
- 編譯標記必須出現(xiàn)在 package 子句之前,并且為了與包文檔區(qū)分開來,它必須后跟一個空行。
二、編譯標簽(build tag)的bool邏輯
當我們在一個包中使用多個標簽時,它們會使用布爾邏輯進行交互,具體取決于我們?nèi)绾芜M行聲明。
Build tags遵循以下三個規(guī)則:
- 以空格分隔的標簽將在 OR 邏輯下進行解釋。
- 逗號分隔的標簽將在 AND 邏輯下進行解釋。
- 每個術語都是一個字母數(shù)字單詞,如果前面有! 它意味著它被否定。
2.1、or標簽邏輯
給定標簽:
// +build tag1 tag2
OR解釋是,如果在執(zhí)行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"
在文件夾里生成了二進制執(zhí)行文件 buildtag
我們執(zhí)行一下:
? ./buildtag
輸出:
mysql dev
3.2.2 多個關系編譯
我們使用
go build -tags "dev prod"
在文件夾里生成了二進制執(zhí)行文件 buildtag
我們執(zhí)行一下:
? ./buildtag
輸出:
mysql dev
mysql prod
四、go:build 與 +build 的區(qū)別
//go:build
是 Go 1.17 中引入的新條件編譯指令格式。它旨在替換
// +build
指令。為何要采用新的格式呢?
對比一下新舊格式的區(qū)別就知道了:
// go:build linux && amd64 || darwin // +build linux,amd64 darwin
顯而易見的優(yōu)勢:
go:build 這種格式,對 coder 來說,更容易理解其邏輯組合與 //go:embed 和 //go:generate 這些命令相比較,格式上進行了統(tǒng)一
其他的學習資料
gin通過go build -tags實現(xiàn)json包的切換
以上就是go編譯標簽build tag注釋里語法詳解的詳細內(nèi)容,更多關于go編譯標簽build tag注釋語法的資料請關注腳本之家其它相關文章!
相關文章
go編程中go-sql-driver的離奇bug解決記錄分析
這篇文章主要為大家介紹了go編程中go-sql-driver的離奇bug解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05Go語言規(guī)范context?類型的key用法示例解析
這篇文章主要為大家介紹了Go語言規(guī)范context?類型的key用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn)
本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05