go build -tags的其他用法命令詳解
一、go build -tags用法?
1. 進(jìn)階邏輯用法(標(biāo)簽組合更靈活)
- “與”邏輯:標(biāo)簽間用空格分隔,必須同時(shí)滿足才編譯
代碼標(biāo)簽://go:build linux && amd64(僅Linux+64位系統(tǒng)生效)
編譯命令:go build -tags "linux amd64"(必須同時(shí)傳兩個(gè)標(biāo)簽,才會(huì)包含這段代碼) - “非”邏輯:用
!排除標(biāo)簽,匹配“不含該標(biāo)簽”的代碼
代碼標(biāo)簽://go:build !windows(除Windows外所有系統(tǒng)生效)
編譯命令:go build -tags "linux"(無需額外傳!windows,只要標(biāo)簽不是windows就會(huì)包含)
2. 關(guān)聯(lián)依賴/編譯細(xì)節(jié)的冷門實(shí)用用法
控制標(biāo)準(zhǔn)庫功能:通過標(biāo)簽啟用標(biāo)準(zhǔn)庫“隱藏功能”
例:go build -tags netgo(強(qiáng)制讓net庫用純Go實(shí)現(xiàn)的網(wǎng)絡(luò)協(xié)議,而非系統(tǒng)底層C實(shí)現(xiàn),避免跨平臺(tái)依賴問題)
配合第三方庫“條件依賴”:只編譯指定庫的代碼
代碼里引了兩個(gè)數(shù)據(jù)庫庫(mysql/redis),分別打標(biāo)簽:
//go:build use_mysql import _ "github.com/go-sql-driver/mysql" //go:build use_redis import _ "github.com/redis/go-redis/v9"
編譯時(shí)只引mysql(不引redis):go build -tags use_mysql(自動(dòng)排除redis依賴,減小程序體積)
多標(biāo)簽批量生效:一次傳多個(gè)標(biāo)簽,匹配“任意一個(gè)”或“組合條件”
命令:go build -tags "prod linux amd64"(會(huì)包含:prod標(biāo)簽代碼 + linux+amd64組合標(biāo)簽代碼 + 無標(biāo)簽代碼)
二、go build -tags和go install -tags有什么區(qū)別?
go build -tags 和 go install -tags 中的 -tags 參數(shù)功能完全一致(都是通過標(biāo)簽控制編譯哪些代碼),核心區(qū)別在于 go build 和 go install 這兩個(gè)命令本身的行為差異,而非 -tags 的用法。
1. 核心差異:命令本身的作用
| 維度 | go build -tags <標(biāo)簽> | go install -tags <標(biāo)簽> |
|---|---|---|
| 輸出位置 | 默認(rèn)在當(dāng)前目錄生成可執(zhí)行文件(可通過 -o 指定路徑) | 固定安裝到 $GOPATH/bin 或 $GOBIN 目錄(無需 -o,文件名固定為包名) |
| 適用場景 | 臨時(shí)編譯、本地測試(輸出文件留在項(xiàng)目內(nèi)) | 安裝可執(zhí)行程序到系統(tǒng)可執(zhí)行路徑(方便全局調(diào)用,如工具類程序) |
| 對模塊緩存的影響 | 不影響,僅生成可執(zhí)行文件 | 會(huì)將編譯結(jié)果緩存到模塊緩存($GOPATH/pkg/mod),加速后續(xù)安裝 |
2.-tags參數(shù)的一致性
兩者的 -tags 用法、邏輯(與/或/非)、對代碼的過濾規(guī)則完全相同。例如:
用標(biāo)簽區(qū)分 dev/prod 環(huán)境時(shí):
# 本地編譯一個(gè)dev版本的可執(zhí)行文件(留在當(dāng)前目錄) go build -tags dev -o myapp-dev # 安裝prod版本到全局路徑(可直接在終端用myapp命令調(diào)用) go install -tags prod
總結(jié)
- 若想臨時(shí)編譯一個(gè)可執(zhí)行文件到當(dāng)前目錄(如測試),用
go build -tags <標(biāo)簽>; - 若想將程序安裝到全局路徑方便長期使用,用
go install -tags <標(biāo)簽>; - 兩者的
-tags作用完全一樣,僅命令的輸出位置和用途不同。
到此這篇關(guān)于go build -tags的其他用法的文章就介紹到這了,更多相關(guān)go build -tags用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用Gin框架實(shí)現(xiàn)http分塊傳輸
這篇文章主要為大家詳細(xì)介紹了Golang中如何使用Gin框架實(shí)現(xiàn)http分塊傳輸功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05
Golang如何實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換的方法示例
進(jìn)制轉(zhuǎn)換是人們利用符號來計(jì)數(shù)的方法,進(jìn)制轉(zhuǎn)換由一組數(shù)碼符號和兩個(gè)基本因素“基數(shù)”與“位權(quán)”構(gòu)成,這篇文章主要給大家介紹了關(guān)于Golang如何實(shí)現(xiàn)10進(jìn)制轉(zhuǎn)換62進(jìn)制的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí)學(xué)習(xí),下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
golang channel讀取數(shù)據(jù)的幾種情況
本文主要介紹了golang channel讀取數(shù)據(jù)的幾種情況,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

