go env
命令go env用于打印Go語言的環(huán)境信息。其中的一些信息我們?cè)谥耙呀?jīng)多次提及,但是卻沒有進(jìn)行詳細(xì)的說明。在本小節(jié),我們會(huì)對(duì)這些信息進(jìn)行深入介紹。我們先來看一看go env命令情況下都會(huì)打印出哪些Go語言通用環(huán)境信息。
go env命令可打印出的Go語言通用環(huán)境信息
> runtime 包 包含與 Go 的運(yùn)行時(shí)系統(tǒng)交互的操作,例如控制 goroutines 的函數(shù)。 > 也包含 reflect 包使用的低級(jí)別的類型信息;查看 reflect 的文檔了解運(yùn)行時(shí)類型的可編程接口。 > 以下環(huán)境變量($name 或 %name% 取決于主機(jī)操作系統(tǒng))控制 Go 程序的運(yùn)行時(shí)行為,其含義和用途可能會(huì)隨版本發(fā)布而變化GOGC
GOGC變量設(shè)置初始垃圾收集目標(biāo)百分比。
當(dāng)新分配的數(shù)據(jù)與上一次收集后剩余的活動(dòng)數(shù)據(jù)的比率達(dá)到此百分比時(shí),將觸發(fā)收集。
默認(rèn)值為GOGC = 100。
設(shè)置GOGC = off會(huì)完全禁用垃圾收集器。
runtime/debug包的SetGCPercent函數(shù)允許在運(yùn)行時(shí)更改此百分比。
GODEBUG
GODEBUG變量控制運(yùn)行時(shí)內(nèi)的調(diào)試變量。
它是以逗號(hào)分隔的name = val對(duì)列表,用于設(shè)置這些命名變量:
allocfreetrace:設(shè)置 `allocfreetrace = 1` 會(huì)導(dǎo)致對(duì)每個(gè)對(duì)象的分配和釋放進(jìn)行概要分析和棧跟蹤。clobberfree:設(shè)置 `clobberfree = 1` 使垃圾回收器在釋放對(duì)象時(shí)用錯(cuò)誤內(nèi)容破壞對(duì)象的內(nèi)存內(nèi)容。cgocheck:設(shè)置 `cgocheck = 0` 禁用使用 cgo 將 Go 指針錯(cuò)誤傳遞到非 Go 代碼的所有包檢查。設(shè)置 `cgocheck = 1`(默認(rèn)值)可以啟用相對(duì)便宜的檢查,這些檢查可能會(huì)遺漏一些錯(cuò)誤。設(shè)置 `cgocheck = 2` 啟用昂貴的檢查,這些檢查不會(huì)遺漏任何錯(cuò)誤,但是會(huì)導(dǎo)致程序運(yùn)行速度變慢。efence:設(shè)置 `efence = 1` 會(huì)導(dǎo)致分配器以某種模式運(yùn)行,在該模式下每個(gè)對(duì)象都分配在一個(gè)唯一的頁面上,地址永遠(yuǎn)不會(huì)被回收。gccheckmark:設(shè)置 `gccheckmark = 1` 可以通過在 STW 時(shí)執(zhí)行第二次標(biāo)記傳遞來驗(yàn)證垃圾收集器的并發(fā)標(biāo)記階段。 如果第二次傳遞找到了一個(gè)并發(fā)標(biāo)記未找到的可達(dá)對(duì)象,垃圾收集器將 panic。gcpacertrace:設(shè)置 `gcpacertrace = 1` 會(huì)導(dǎo)致垃圾收集器打印有關(guān)并發(fā) pacer 內(nèi)部狀態(tài)的信息。gcshrinkstackoff:設(shè)置 `gcshrinkstackoff = 1` 禁止將 goroutines 移動(dòng)到較小的棧上。 在這種模式下,goroutine 的棧只能增長。gcstoptheworld:設(shè)置 `gcstoptheworld = 1` 禁用并發(fā)垃圾收集,使每個(gè)垃圾收集成為一個(gè) STW 事件。設(shè)置 `gcstoptheworld = 2` 還會(huì)在垃圾收集完成后禁用并發(fā)清除。 gctrace:設(shè)置 `gctrace = 1` 會(huì)導(dǎo)致垃圾收集器在每次收集時(shí)向標(biāo)準(zhǔn)錯(cuò)誤輸出發(fā)出一行, 匯總收集的內(nèi)存量和暫停的長度。此行的格式可能會(huì)發(fā)生變化。目前格式是:gc # @#s #%: #+#+# ms clock, #+#/#/#+# ms cpu, #->#-># MB, # MB goal, # P其中字段含義如下('#' 代表數(shù)字):gc # 每次 GC 時(shí)遞增的 GC 編號(hào)@#s 程序運(yùn)行的秒數(shù)#% 自程序啟動(dòng)后在 GC 中花費(fèi)的時(shí)間百分比#+...+# GC 各階段的掛鐘時(shí)間(wall-clock)/CPU 時(shí)間#->#-># MB GC 開始時(shí)的堆大小、GC 結(jié)束時(shí)的堆大小和活動(dòng)堆大小# MB goal 目標(biāo)堆大小# P 使用的處理器數(shù)量這些階段是 stop-the-world(STW)清除終止(sweep termination), 并發(fā)標(biāo)記和掃描,以及 STW 標(biāo)記終止(mark termination)。`mark/scan` 的 CPU 時(shí)間被分解為輔助時(shí)間(根據(jù)分配執(zhí)行的 GC)、后臺(tái) GC 時(shí)間和空閑 GC 時(shí)間。如果該行以 `"(forced)"` 結(jié)尾,則此 GC 由 `runtime.GC()` 調(diào)用強(qiáng)制執(zhí)行。掛鐘時(shí)間:
根據(jù)計(jì)算機(jī)的內(nèi)部時(shí)鐘流逝的時(shí)間,這應(yīng)該與外界的時(shí)間相匹配。
這與 CPU 使用率無關(guān); 它僅供參考。
如果掛鐘時(shí)間 < CPU 時(shí)間,那么您正在并行執(zhí)行一個(gè)程序。
如果掛鐘時(shí)間 > CPU時(shí)間,則表示您正在等待磁盤,網(wǎng)絡(luò)或其他設(shè)備。
將 `gctrace` 設(shè)置為任何大于 0 的值也會(huì)導(dǎo)致垃圾收集器在將內(nèi)存釋放回系統(tǒng)時(shí)發(fā)出摘要。 將內(nèi)存返回到系統(tǒng)的這個(gè)過程稱為清除(`scavenging`)。 此摘要的格式可能會(huì)更改。目前格式是:scvg#: # MB released printed only if non-zeroscvg#: inuse: # idle: # sys: # released: # consumed: # (MB)其中字段含義如下('#' 代表數(shù)字):scvg# 清除周期數(shù),每次清除時(shí)遞增inuse: # MB 已使用或部分使用的 spansidle: # MB spans 待清除sys: # 從系統(tǒng)映射的 MBreleased: # 釋放到系統(tǒng)的 MBconsumed: # 從系統(tǒng)中分配的 MB madvdontneed:設(shè)置 madvdontneed = 1 當(dāng)將內(nèi)存返回到內(nèi)核時(shí),將在 Linux 上使用 MADV_DONTNEED 而不是 MADV_FREE。這效率較低,但會(huì)導(dǎo)致 RSS(resident set size 常駐內(nèi)存集)數(shù)量下降得更快。madvise() ?系統(tǒng)調(diào)用允許一個(gè)了解其內(nèi)存行為的進(jìn)程將其描述給系統(tǒng),給予使用內(nèi)存的建議。
int
madvise(void *addr, size_t len, int advice);
系統(tǒng)可以使用傳入的建議來更改其虛擬內(nèi)存分頁策略。
此建議可以提高應(yīng)用程序和系統(tǒng)性能。建議有很多種其中兩種:
MADV_DONTNEED:
表示應(yīng)用程序不希望很快訪問此地址范圍。
MADV_FREE:
表示應(yīng)用程序不需要此地址范圍中包含的信息,因此可以立即重用這些頁面。
地址范圍仍然有效。
invalidptr:默認(rèn) `invalidptr = 1`,如果在指針類型的位置中發(fā)現(xiàn)無效的指針值(例如,1), 則會(huì)導(dǎo)致垃圾收集器和棧復(fù)制器使程序 crash。設(shè)置 `invalidptr = 0` 將禁用此檢查。這應(yīng)該只被用作診斷錯(cuò)誤代碼的臨時(shí)解決方案。真正的解決方案是不將整數(shù)存儲(chǔ)在指針類型的位置。 sbrk:設(shè)置 `sbrk = 1` 用一個(gè)簡單的分配器替換內(nèi)存分配器和垃圾收集器, 該分配器從操作系統(tǒng)獲取內(nèi)存并且永遠(yuǎn)不會(huì)回收任何內(nèi)存。
scavenge:`scavenge = 1` 啟用堆清除程序的調(diào)試模式。
scheddetail:設(shè)置 `schedtrace = X` 和 `scheddetail = 1` 會(huì)導(dǎo)致調(diào)度程序每 `X` 毫秒發(fā)出一次詳細(xì)的多行信息, 描述`調(diào)度程序`,`處理器`,`線程` 和 `goroutines` 的狀態(tài)。schedtrace:設(shè)置 `schedtrace = X` 使調(diào)度程序每 `X` 毫秒發(fā)出一行標(biāo)準(zhǔn)錯(cuò)誤,匯總調(diào)度程序狀態(tài)。
tracebackancestors:設(shè)置 `tracebackancestors = N` 使用創(chuàng)建 `goroutines` 的棧擴(kuò)展回溯, 其中 `N` 限制要報(bào)告的祖先 `goroutines` 的數(shù)量。這也擴(kuò)展了 `runtime.Stack` 返回的信息。祖先的 `goroutine IDs` 將引用創(chuàng)建時(shí) goroutine 的 ID; 這個(gè) ID 有可能被重用于另一個(gè) goroutine。將 `N` 設(shè)置為 0 將不報(bào)告任何祖先信息。
net,net/http和crypto/tls?也引用GODEBUG中的調(diào)試變量
GOMAXPROCS
GOMAXPROCS變量限制了可以同時(shí)執(zhí)行用戶級(jí) Go 代碼的操作系統(tǒng)線程數(shù)
(即,可以同時(shí)執(zhí)行的最大CPU數(shù))。
代表 Go 代碼在系統(tǒng)調(diào)用中可以阻塞的線程數(shù)沒有限制;那些不計(jì)入GOMAXPROCS限制。
該包的GOMAXPROCS函數(shù)查詢并更改限制。
GOTRACEBACK
GOTRACEBACK變量控制 Go 程序因未恢復(fù)的panic或意外的運(yùn)行時(shí)條件而失敗時(shí)生成的輸出量。
默認(rèn)情況下,失敗會(huì)打印當(dāng)前goroutine的棧跟蹤,省略運(yùn)行時(shí)系統(tǒng)內(nèi)部的函數(shù),然后使用退出代碼2退出。
如果當(dāng)前goroutine或者故障都不在運(yùn)行時(shí)內(nèi)部,則故障會(huì)打印所有g(shù)oroutines的棧跟蹤。
-
GOTRACEBACK = none完全省略了 goroutine 棧跟蹤。
-
GOTRACEBACK = single(默認(rèn)值)的行為如上所述。
-
GOTRACEBACK = all為用戶創(chuàng)建的所有 goroutines 添加棧跟蹤。
-
GOTRACEBACK=system就像"all",但為運(yùn)行時(shí)函數(shù)添加了棧幀,并顯示了運(yùn)行時(shí)內(nèi)部創(chuàng)建的 goroutine。
-
GOTRACEBACK=crash就像"system",但是以特定于操作系統(tǒng)的方式 crash 而不是退出。例如,在Unix系統(tǒng)上,crash引發(fā)SIGABRT以觸發(fā)核心轉(zhuǎn)儲(chǔ)(core dump)。
由于歷史原因,GOTRACEBACK設(shè)置0,1和2分別是none,all和system的同義詞。
runtime/debug包的SetTraceback函數(shù)允許在運(yùn)行時(shí)增加輸出量,但不能減少到低于環(huán)境變量指定的輸出量
CGO_ENABLED
通過上一小節(jié)的介紹,相信讀者對(duì)cgo工具已經(jīng)很熟悉了。我們提到過,標(biāo)準(zhǔn)go命令可以自動(dòng)的使用cgo工具對(duì)導(dǎo)入了代碼包C的代碼包和源碼文件進(jìn)行處理。這里所說的“自動(dòng)”并不是絕對(duì)的。因?yàn)楫?dāng)環(huán)境變量CGO_ENABLED被設(shè)置為0時(shí),標(biāo)準(zhǔn)go命令就不能處理導(dǎo)入了代碼包C的代碼包和源碼文件了。請(qǐng)看下面的示例:
hc@ubt:~/golang/goc2p/src/basic/cgo$ export CGO_ENABLED=0 hc@ubt:~/golang/goc2p/src/basic/cgo$ go build -x WORK=/tmp/go-build775234613我們臨時(shí)把環(huán)境變量CGO_ENABLED的值設(shè)置為0,然后執(zhí)行g(shù)o build命令并加入了標(biāo)記-x。標(biāo)記-x會(huì)讓命令程序?qū)⑦\(yùn)行期間所有實(shí)際執(zhí)行的命令都打印到標(biāo)準(zhǔn)輸出。但是,在執(zhí)行命令之后沒有任何命令被打印出來。這說明對(duì)代碼包basic/cgo的構(gòu)建操作并沒有被執(zhí)行。這是因?yàn)?#xff0c;構(gòu)建這個(gè)代碼包需要用到cgo工具,但cgo工具已經(jīng)被禁用了。下面,我們?cè)賮磉\(yùn)行調(diào)用了代碼包basic/cgo中函數(shù)的命令源碼文件cgo_demo.go。也就是說,命令源碼文件cgo_demo.go間接的導(dǎo)入了代碼包C。還記得嗎?這個(gè)命令源碼文件被存放在goc2p項(xiàng)目的代碼包basic/cgo中。示例如下:
hc@ubt:~/golang/goc2p/src/basic/cgo$ export CGO_ENABLED=0 hc@ubt:~/golang/goc2p/src/basic/cgo$ go run -work cgo_demo.go WORK=/tmp/go-build856581210 # command-line-arguments ./cgo_demo.go:4: can't find import: "basic/cgo/lib"在上面的示例中,我們?cè)趫?zhí)行g(shù)o run命令時(shí)加入了兩個(gè)標(biāo)記——-a和-work。標(biāo)記-a會(huì)使命令程序強(qiáng)行重新構(gòu)建所有的代碼包(包括涉及到的標(biāo)準(zhǔn)庫),即使它們已經(jīng)是最新的了。標(biāo)記-work會(huì)使命令程序?qū)⑴R時(shí)工作目錄的絕對(duì)路徑打印到標(biāo)準(zhǔn)輸出。命令程序輸出的錯(cuò)誤信息顯示,命令程序沒有找到代碼包basic/cgo。其原因是由于代碼包basic/cgo無法被構(gòu)建。所以,命令程序在臨時(shí)工作目錄和工作區(qū)中都找不到代碼包basic/cgo對(duì)應(yīng)的歸檔文件cgo.a。如果我們使用命令ll /tmp/go-build856581210查看臨時(shí)工作目錄,也找不到名為basic的目錄。
不過,如果我們?cè)诃h(huán)境變量CGO_ENABLED的值為1的情況下生成代碼包basic/cgo對(duì)應(yīng)的歸檔文件cgo.a,那么無論我們之后怎樣改變環(huán)境變量CGO_ENABLED的值也都可以正確的運(yùn)行命令源碼文件cgo_demo.go。即使我們?cè)趫?zhí)行g(shù)o run命令時(shí)加入標(biāo)記-a也是如此。因?yàn)槊畛绦蛞廊豢梢栽诠ぷ鲄^(qū)中找到之前在我們執(zhí)行g(shù)o install命令時(shí)生成的歸檔文件cgo.a。示例如下:
hc@ubt:~/golang/goc2p/src/basic/cgo$ export CGO_ENABLED=1 hc@ubt:~/golang/goc2p/src/basic/cgo$ go install ../basic/cgo hc@ubt:~/golang/goc2p/src/basic/cgo$ export CGO_ENABLED=0 hc@ubt:~/golang/goc2p/src/basic/cgo$ go run -a -work cgo_demo.go WORK=/tmp/go-build130612063 The square root of 2.330000 is 1.526434. ABC CFunction1() is called. GoFunction1() is called.由此可知,只要我們事先成功安裝了引用了代碼包C的代碼包,即生成了對(duì)應(yīng)的代碼包歸檔文件,即使cgo工具在之后被禁用,也不會(huì)影響到其它Go語言代碼對(duì)該代碼包的使用。當(dāng)然,命令程序首先會(huì)到臨時(shí)工作目錄中尋找需要的代碼包歸檔文件。
關(guān)于cgo工具還有一點(diǎn)需要特別注意,即:當(dāng)存在交叉編譯的情況時(shí),cgo工具一定是不可用的。在標(biāo)準(zhǔn)go命令的上下文環(huán)境中,交叉編譯意味著程序構(gòu)建環(huán)境的目標(biāo)計(jì)算架構(gòu)的標(biāo)識(shí)與程序運(yùn)行環(huán)境的目標(biāo)計(jì)算架構(gòu)的標(biāo)識(shí)不同,或者程序構(gòu)建環(huán)境的目標(biāo)操作系統(tǒng)的標(biāo)識(shí)與程序運(yùn)行環(huán)境的目標(biāo)操作系統(tǒng)的標(biāo)識(shí)不同。在這里,我們可以粗略認(rèn)為交叉編譯就是在當(dāng)前的計(jì)算架構(gòu)和操作系統(tǒng)下編譯和構(gòu)建Go語言代碼并生成針對(duì)于其他計(jì)算架構(gòu)或/和操作系統(tǒng)的編譯結(jié)果文件和可執(zhí)行文件。
GOARCH
GOARCH的值的含義是程序構(gòu)建環(huán)境的目標(biāo)計(jì)算架構(gòu)的標(biāo)識(shí),也就是程序在構(gòu)建或安裝時(shí)所對(duì)應(yīng)的計(jì)算架構(gòu)的名稱。在默認(rèn)情況下,它會(huì)與程序運(yùn)行環(huán)境的目標(biāo)計(jì)算架構(gòu)一致。即它的值會(huì)與GOHOSTARCH的值是相同。但如果我們顯式的設(shè)置了環(huán)境變量GOARCH,則它的值就會(huì)是這個(gè)環(huán)境變量的值。
GOBIN
GOBIN的值為存放可執(zhí)行文件的目錄的絕對(duì)路徑。它的值來自環(huán)境變量GOBIN。在我們使用go tool install命令安裝命令源碼文件時(shí)生成的可執(zhí)行文件會(huì)存放于這個(gè)目錄中。
GOCHAR
GOCHAR的值是程序構(gòu)建環(huán)境的目標(biāo)計(jì)算架構(gòu)的單字符標(biāo)識(shí)。它的值會(huì)根據(jù)GOARCH的值來設(shè)置。當(dāng)GOARCH的值為386時(shí),GOCHAR的值就是8。當(dāng)GOARCH的值為amd64時(shí)GOCHAR的值就是6。而GOCHAR的值5與GOARCH的值arm相對(duì)應(yīng)。
GOCHAR主要有兩個(gè)用途,列舉如下:
Go語言官方的平臺(tái)相關(guān)的工具的名稱會(huì)以它的值為前綴。的名稱會(huì)以GOCHAR的值為前綴。比如,在amd64計(jì)算架構(gòu)下,用于編譯Go語言代碼的編譯器的名稱是6g,鏈接器的名稱是6l。用于編譯C語言代碼的編譯器的名稱是6c。而用于編譯匯編語言代碼的編譯器的名稱為6a。
Go語言的官方編譯器生成的結(jié)果文件會(huì)以GOCHAR的值作為擴(kuò)展名。Go語言的官方編譯器6g在對(duì)命令源碼文件編譯之后會(huì)把結(jié)果文件go.6存放到臨時(shí)工作目錄的相應(yīng)位置中。
GOEXE
GOEXE的值會(huì)被作為可執(zhí)行文件的后綴。它的值與GOOS的值存在一定關(guān)系,即只有GOOS的值為“windows”時(shí)GOEXE的值才會(huì)是“.exe”,否則其值就為空字符串“”。這與在各個(gè)操作系統(tǒng)下的可執(zhí)行文件的默認(rèn)后綴是一致的。
GOHOSTARCH
GOHOSTARCH的值的含義是程序運(yùn)行環(huán)境的目標(biāo)計(jì)算架構(gòu)的標(biāo)識(shí),也就是程序在運(yùn)行時(shí)所在的計(jì)算機(jī)系統(tǒng)的計(jì)算架構(gòu)的名稱。在通常情況下,它的值不需要被顯式的設(shè)置。因?yàn)橛脕戆惭bGo語言的二進(jìn)制分發(fā)文件和MSI(Microsoft軟件安裝)軟件包文件都是平臺(tái)相關(guān)的。所以,對(duì)于不同計(jì)算架構(gòu)的Go語言環(huán)境來說,它都會(huì)是一個(gè)常量。
GOHOSTOS
GOHOSTOS的值的含義是程序運(yùn)行環(huán)境的目標(biāo)操作系統(tǒng)的標(biāo)識(shí),也即程序在運(yùn)行時(shí)所在的計(jì)算機(jī)系統(tǒng)的操作系統(tǒng)的名稱。與GOHOSTARCH類似,它的值在不同的操作系統(tǒng)下是固定不變的,同樣不需要顯式的設(shè)置。
GOPATH
這個(gè)環(huán)境信息我們?cè)谥耙呀?jīng)提到過很多次。它的值指明了Go語言工作區(qū)目錄的絕對(duì)路徑。我們需要顯式的設(shè)置環(huán)境變量GOPATH。如果有多個(gè)工作區(qū),那么多個(gè)工作區(qū)的絕對(duì)路徑之間需要用分隔符分隔。在windows操作系統(tǒng)下,這個(gè)分隔符為“;”。在其它操作系統(tǒng)下,這個(gè)分隔符為“:”。注意,GOPATH的值不能與GOROOT的值相同。
GORACE
GORACE的值包含了用于數(shù)據(jù)競爭檢測(cè)的相關(guān)選項(xiàng)。數(shù)據(jù)競爭是在并發(fā)程序中最常見和最難調(diào)試的一類bug。數(shù)據(jù)競爭會(huì)發(fā)生在多個(gè)Goroutine爭相訪問相同的變量且至少有一個(gè)Goroutine中的程序在對(duì)這個(gè)變量進(jìn)行寫操作的情況下。
數(shù)據(jù)競爭檢測(cè)需要被顯式的開啟。還記得標(biāo)記-race嗎?我們可以通過在執(zhí)行一些標(biāo)準(zhǔn)go命令時(shí)加入這個(gè)標(biāo)記來開啟數(shù)據(jù)競爭檢測(cè)。在這種情況下,GORACE的值就會(huì)被使用到了。支持-race標(biāo)記的標(biāo)準(zhǔn)go命令包括:go test命令、go run命令、go build命令和go install命令。
GORACE的值形如“option1=val1 option2=val2”,即:選項(xiàng)名稱與選項(xiàng)值之間以等號(hào)“=”分隔,多個(gè)選項(xiàng)之間以空格“ ”分隔。數(shù)據(jù)競爭檢測(cè)的選項(xiàng)包括log_path、exitcode、strip_path_prefix和history_size。為了設(shè)置GORACE的值,我們需要設(shè)置環(huán)境變量GORACE?;蛘?#xff0c;我們也可以在執(zhí)行g(shù)o命令時(shí)臨時(shí)設(shè)置它,像這樣:
hc@ubt:~/golang/goc2p/src/cnet/ctcp$ GORACE="log_path=/home/hc/golang/goc2p /race/report strip_path_prefix=home/hc/golang/goc2p/" go test -race關(guān)于數(shù)據(jù)競爭檢測(cè)的更多細(xì)節(jié)我們將會(huì)在本書的第三部分予以說明。
GOROOT
GOROOT會(huì)是我們?cè)诎惭bGo語言時(shí)第一個(gè)碰到Go語言環(huán)境變量。它的值指明了Go語言的安裝目錄的絕對(duì)路徑。但是,只有在非默認(rèn)情況下我們才需要顯式的設(shè)置環(huán)境變量GOROOT。這里所說的默認(rèn)情況是指:在Windows操作系統(tǒng)下我們把Go語言安裝到c:\Go目錄下,或者在其它操作系統(tǒng)下我們把Go語言安裝到/usr/local/go目錄下。另外,當(dāng)我們不是通過二進(jìn)制分發(fā)包來安裝Go語言的時(shí)候,也不需要設(shè)置環(huán)境變量GOROOT的值。比如,在Windows操作系統(tǒng)下,我們可以使用MSI軟件包文件來安裝Go語言。
GOTOOLDIR
GOTOOLDIR的值指明了Go工具目錄的絕對(duì)路徑。根據(jù)GOROOT、GOHOSTOS和GOHOSTARCH來設(shè)置。其值為$GOROOT/pkg/tool/$GOOS_$GOARCH。關(guān)于這個(gè)目錄,我們?cè)谥耙蔡岬竭^多次。
除了上面介紹的這些通用的Go語言環(huán)境信息,還兩個(gè)針對(duì)于非Plan 9操作系統(tǒng)的環(huán)境信息。它們是CC和GOGCCFLAGS。環(huán)境信息CC的值是操作系統(tǒng)默認(rèn)的C語言編譯器的命令名稱。環(huán)境信息GOGCCFLAGS的值則是Go語言在使用操作系統(tǒng)的默認(rèn)C語言編譯器對(duì)C語言代碼進(jìn)行編譯時(shí)加入的參數(shù)。
如果我們要有針對(duì)性的查看上述的一個(gè)或多個(gè)環(huán)境信息,可以在go env命令的后面加入它們的名字并執(zhí)行之。在go env命令和環(huán)境信息名稱之間需要用空格分隔,多個(gè)環(huán)境信息名稱之間也需要用空格分隔。示例如下:
hc@ubt:~$ go env GOARCH GOCHAR 386 8上例的go env命令的輸出信息中,每一行對(duì)一個(gè)環(huán)境信息的值,且其順序與我們輸入的環(huán)境信息名稱的順序一致。比如,386為環(huán)境信息GOARCH,而8則是環(huán)境信息GOCHAR的值。
go env命令能夠讓我們對(duì)當(dāng)前的Go語言環(huán)境進(jìn)行簡要的了解。通過它,我們也可以對(duì)當(dāng)前安裝的Go語言的環(huán)境設(shè)置進(jìn)行簡單的檢查。
總結(jié)
- 上一篇: 协程-泄露
- 下一篇: gometalinter代码检查