自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于 Go 的高級(jí)構(gòu)建指南

開(kāi)發(fā) 后端
本文將探索 Golang 高級(jí)構(gòu)建技巧,從而有助于創(chuàng)建更高效的二進(jìn)制文件。

構(gòu)建選項(xiàng)

以下是 go build 命令最常用的一些選項(xiàng):

  • -o: 指定輸出文件名。默認(rèn)輸出文件名是主軟件包的名稱,在 Windows 系統(tǒng)中會(huì)自動(dòng)添加 .exe 后綴。
  • -v: 詳細(xì)輸出。該選項(xiàng)會(huì)在編譯時(shí)打印軟件包的名稱。
  • -work: 打印臨時(shí)工作目錄,退出時(shí)不刪除。該選項(xiàng)對(duì)調(diào)試很有用。
  • -x: 打印指令。該選項(xiàng)可打印 go build 正在執(zhí)行的指令。
  • -asmflags: 傳遞給 go tool asm 調(diào)用的參數(shù)。
  • -buildmode: 要使用的編譯模式。默認(rèn)構(gòu)建模式為 exe。其他可能的值包括shared、pie和plugin。
  • -buildvcs: 是否在二進(jìn)制文件中加入版本控制信息。默認(rèn)值為auto(自動(dòng))。

有關(guān) go build 命令的更多信息,可以運(yùn)行以下命令:

go help build

包含哪些文件

在 Go 中使用 go build 命令時(shí),會(huì)編譯當(dāng)前目錄及其子目錄中的 Go 源文件,以創(chuàng)建可執(zhí)行的二進(jìn)制文件。默認(rèn)情況下只編譯 .go 文件,而忽略目錄中的其他文件類型。不過(guò),值得注意的是,go build 命令的行為可能會(huì)受到構(gòu)建標(biāo)簽和構(gòu)建約束的影響。

go build 通常會(huì)忽略以下類型的文件:

(1) 擴(kuò)展名不是 .go 的文件:

目錄中任何沒(méi)有 .go 擴(kuò)展名的文件都將被忽略,包括文本文件、配置文件、圖片等。

(2) 子目錄中的文件:

go build 命令編譯當(dāng)前目錄及其子目錄中所有 .go 文件,其他文件和目錄通常會(huì)被忽略。

(3) 以下劃線或點(diǎn)號(hào)開(kāi)頭的文件:

go 工具會(huì)忽略以 . 或 _ 開(kāi)頭的目錄和文件名,以及名為 testdata 的目錄。

(4) 被構(gòu)建約束排除的文件:

Go 支持構(gòu)建約束,允許根據(jù)目標(biāo)操作系統(tǒng)或體系架構(gòu)等條件,構(gòu)建過(guò)程中包含或排除特定文件。例如,在為非 Windows 平臺(tái)構(gòu)建時(shí),帶有 //go:build windows 等構(gòu)建約束的文件將被忽略。

(5) 通過(guò)構(gòu)建標(biāo)簽排除的文件:

構(gòu)建標(biāo)簽是 Go 源文件中的特殊注釋,可用于根據(jù)自定義條件指定哪些文件應(yīng)包含在編譯中。如果文件的構(gòu)建標(biāo)記與構(gòu)建上下文不匹配,則會(huì)被忽略。

(6) "testdata"目錄中的文件:

testdata 的目錄中的文件將被忽略。該目錄通常用于包含與測(cè)試相關(guān)的數(shù)據(jù),而這些數(shù)據(jù)并不需要編譯。

構(gòu)建標(biāo)簽

Go 的構(gòu)建標(biāo)簽提供了一種強(qiáng)大的機(jī)制,可在構(gòu)建過(guò)程中包含或排除特定代碼。通過(guò)使用構(gòu)建標(biāo)簽,開(kāi)發(fā)人員可以定制自己的應(yīng)用程序,使其適用于不同的構(gòu)建配置、環(huán)境或特定平臺(tái)要求。這一功能在處理交叉編譯或?yàn)樘囟ú僮飨到y(tǒng)創(chuàng)建二進(jìn)制文件時(shí)尤為重要。

構(gòu)建標(biāo)簽是放在 Go 源文件開(kāi)頭的注釋,指定了一組條件,標(biāo)識(shí)在這些條件下,該文件中的代碼應(yīng)被包含或排除在聯(lián)編過(guò)程之外。語(yǔ)法是 //go:build 。例如,考慮這樣一種情況:只有在為應(yīng)用程序的某個(gè)版本構(gòu)建時(shí),才會(huì)包含一段特定的代碼:

main.go

package mainimport "fmt"

var version string
func main() {
    fmt.Println(version)
}

pro.go

//go:build pro
package main
func init() {
    version = "pro"
}

free.go

//go:build free
package main
func init() {
    version = "free"
}

當(dāng)使用 -tags=free 時(shí),輸出將是 free,因?yàn)?nbsp;free.go 文件已包含在內(nèi)。而使用 -tags=pro 時(shí),輸出將是 pro。

構(gòu)建標(biāo)簽語(yǔ)法

可以像使用編程中的其他條件語(yǔ)句一樣組合約束條件,如 AND、OR、NOT。

NOT:

//go:build !cgo

只有在未啟用 CGO 的情況下,才會(huì)在構(gòu)建過(guò)程中包含該文件。

AND:

//go:build cgo && darwin

只有啟用 CGO 并且 GOOS 設(shè)置為 darwin 的情況下,才會(huì)在構(gòu)建過(guò)程中包含該文件。

OR:

//go:build darwin || linux

組合使用:

//go:build (linux || 386) && (darwin || !cgo)

注意:1.16 及更早版本的 Go 使用了不同的構(gòu)建約束語(yǔ)法,前綴為 // +build。當(dāng)遇到舊語(yǔ)法時(shí),gofmt 命令將添加等效的 //go:build 約束。

構(gòu)建約束

除了使用構(gòu)建參數(shù)設(shè)置自定義構(gòu)建標(biāo)簽,golang 也會(huì)根據(jù)環(huán)境變量和其他因素自動(dòng)設(shè)置一些標(biāo)簽。以下是可用標(biāo)記的列表:

(1) GOOS 和 GOARCH 環(huán)境變量

可以在源代碼中設(shè)置限制條件,只有在使用了特定 GOOS 或 GOARCH 時(shí)才能運(yùn)行文件,例如:

//go:build darwin,amd64
package utils

(2) GO 版本限制

可以根據(jù)構(gòu)建整個(gè)模塊時(shí)使用的 go 版本來(lái)約束是否包含文件。例如,要只在使用 go 版本為 1.12 及以上時(shí)構(gòu)建文件,可以使用 //go:build go1.18。如果 go 的版本是 1.18 或 1.21(截至本文撰寫(xiě)時(shí)的最新版本),則會(huì)包含該文件。

責(zé)任編輯:趙寧寧 來(lái)源: DeepNoMind
相關(guān)推薦

2012-11-20 10:20:57

Go

2024-01-15 06:11:13

Go構(gòu)建器模式開(kāi)發(fā)

2024-08-29 10:12:35

RPC通信機(jī)制遠(yuǎn)程過(guò)程

2025-03-26 03:20:00

2025-03-14 00:53:12

2022-04-30 18:42:38

Go編程語(yǔ)言

2013-05-28 09:43:38

GoGo語(yǔ)言并發(fā)模式

2023-04-14 11:04:43

2021-02-03 15:10:38

GoKubernetesLinux

2023-11-22 08:00:56

Go命名規(guī)范

2022-03-25 21:57:49

匯編Go語(yǔ)言

2012-11-05 10:55:59

網(wǎng)絡(luò)虛擬化VXLAN

2017-11-22 13:01:03

Go技術(shù)棧構(gòu)建

2023-07-14 08:23:07

arrayRecordArray

2020-05-20 12:30:44

容器Linux系統(tǒng)

2013-03-12 09:50:45

GoRESTful Web

2017-09-04 09:21:11

機(jī)器學(xué)習(xí)傻瓜指南

2023-09-10 00:08:07

2017-11-27 16:37:42

Python大數(shù)據(jù)數(shù)據(jù)分析

2023-11-06 13:32:38

Go編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)