1. 程式人生 > 其它 >Go基礎0x02-go build -tags使用

Go基礎0x02-go build -tags使用

Go語言提供的build -tags條件編譯特性,顧名思義,只有在特定條件下才會構建對應的程式碼。本文實現一個根據go bulid -tags功能來編譯不同版本的做法,version引數根據tags傳進來的值進行編譯。

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

命令會報version重複定義。

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 收藏 關注 評論