Go基礎0x02-go build -tags使用
阿新 • • 發佈:2021-08-12
Go語言提供的build -tags條件編譯特性,顧名思義,只有在特定條件下才會構建對應的程式碼。本文實現一個根據go bulid -tags功能來編譯不同版本的做法,version引數根據tags傳進來的值進行編譯。
命令會報version重複定義。
Go語言提供的build -tags
條件編譯特性,顧名思義,只有在特定條件下才會構建對應的程式碼。
本文實現一個根據go bulid -tags
功能來編譯不同版本的做法,version引數根據tags傳進來的值進行編譯。
main.go
package main
import "fmt"
// HINT: You might need to move this declaration to a different file.
// const version = "dev"
func main() {
fmt.Printf("running %s version", version)
}
dev_config.go
// +build dev
package main
var version = "DEV"
上面程式碼的關鍵是// +build dev
這行程式碼,注意這行程式碼前後須有一個空行隔開,例如該程式碼出現在第一行時,則接下來要空出一行。
另外,這個檔案只會被go bulid
識別到,而go run
等命令不會去識別這個檔案。
release_config.go
// +build release
package main
const version = "RELEASE"
程式碼已經準備完畢,還有一個地方要注意,需要註釋掉main.go
中的const version = 'dev'
這行程式碼,否則,go bulid
go build -tags測試
執行命令如下:
$ go build -tags dev -o dev_version
$ ./dev_version
running DEV version
$ go build -tags release -o release_version
$ ./release_version
running RELEASE version
go build -ldflags
go build
還支援通過命令列傳遞編譯引數,通過-ldflags
引數實現。
$ go build -ldflags '-X main.version="dev"' -o dev_version $ ./dev_version running "dev" version
關於tags的補充說明
- 構建約束以一行+build開始的註釋。在+build之後列出了一些條件,在這些條件成立時,該檔案應包含在編譯的包中;
- 約束可以出現在任何原始檔中,不限於go檔案;
- +build必須出現在package語句之前,+build註釋之後應要有一個空行;
- 多個條件之間,空格表示OR;逗號表示AND;歎號(!)表示NOT;
- 一個檔案可以有多個+build,它們之間的關係是AND。
參考
[1]https://www.cnblogs.com/linyihai/p/10859945.html
[2]https://zhuanlan.zhihu.com/p/269746831
(全文完)
更多關於大資料、分散式、儲存、區塊鏈、Linux相關文章請關注微信公眾號:asympTech漸進線實驗室
Github、知乎、部落格園、CSDN、簡書全網唯一id:JasonCeng
技術人,不白嫖,如果您覺得文章對您有幫助,幫忙點個推薦吧~
頂 Top 收藏 關注 評論