【譯】Go工具要點
你是剛開始使用Go工具么?或者你想擴展知識?這篇文章將會描述每個人都需要知道的Go工具參數。
$ go build -x
-x 會列出來 go build 調用到的所有命令。
如果你對Go的工具鏈好奇,或者使用了一個跨C編譯器,并且想知道調用外部編譯器用到的具體參數,或者懷疑鏈接器有bug;使用 -x 來查看所有調用。
$ go build -x WORK=/var/folders/00/1b8h8000h01000cxqpysvccm005d21/T/go-build600909754 mkdir -p $WORK/hello/perf/_obj/ mkdir -p $WORK/hello/perf/_obj/exe/ cd /Users/jbd/src/hello/perf /Users/jbd/go/pkg/tool/darwin_amd64/compile -o $WORK/hello/perf.a -trimpath $WORK -p main -complete -buildid bbf8e880e7dd4114f42a7f57717f9ea5cc1dd18d -D _/Users/jbd/src/hello/perf -I $WORK -pack ./perf.go cd . /Users/jbd/go/pkg/tool/darwin_amd64/link -o $WORK/hello/perf/_obj/exe/a.out -L $WORK -extld=clang -buildmode=exe -buildid=bbf8e880e7dd4114f42a7f57717f9ea5cc1dd18d $WORK/hello/perf.a mv $WORK/hello/perf/_obj/exe/a.out perf
$ go build -gcflags
這個參數將會傳遞給編譯器。 go tool compile -help 列出來了所有我們可以傳遞給編譯器的參數。
例如,禁用編譯器優化和內聯優化,你可以使用下面的參數:
$ go build -gcflags="-N -I"
$ go test -v
這個命令可以為測試提供完整的輸出。它會打印測試名稱、狀態(成功或者失敗)、測試所耗費的時間,還有測試的日志等等。
如果不使用 -v 參數來測試,輸出很少很多,我經常使用 -v 參數來打開詳細測試日志。例子:
$ go test -v context === RUN TestBackground --- PASS: TestBackground (0.00s) === RUN TestTODO --- PASS: TestTODO (0.00s) === RUN TestWithCancel --- PASS: TestWithCancel (0.10s) === RUN TestParentFinishesChild --- PASS: TestParentFinishesChild (0.00s) === RUN TestChildFinishesFirst --- PASS: TestChildFinishesFirst (0.00s) === RUN TestDeadline --- PASS: TestDeadline (0.16s) === RUN TestTimeout --- PASS: TestTimeout (0.16s) === RUN TestCanceledTimeout --- PASS: TestCanceledTimeout (0.10s) ... PASS ok context 2.426s
$ go test -race
現在可以使用Go工具提供的 -race 參數進行競爭檢測。它會檢測并報告競爭。開發的過程中用這個命令來檢測一下。
注:完整的命令是:
$ go test -race mypkg // to test the package $ go run -race mysrc.go // to run the source file $ go build -race mycmd // to build the command
$ go test -run
你可以在測試的時候通過 -run 參數來正則匹配過濾需要測試的代碼。下面的命令只會運行 test examples 。
$ go test -run=Example
$ go test -coverprofile
當測試一個包的時候,可以輸出一個測試覆蓋率,然后使用命令 go tool 來在瀏覽器里面可視化。
$ go test -coverprofile=c.out && go tool cover -html=c.out
上面的命令將會創建一個測試覆蓋率文件在瀏覽器打開結果。可視化的結果看起來是下面的結果:
注:測試fmt包
go test -coverprofile=c.out fmt
$ go test -exec
一般很少有人知道Go的這個功能,你可以通過 -exec 插入另一個程序。這個參數允許通過Go工具完成一些外部工作。
一個常見的需求場景是你需要在一些宿主機上面執行一些測試。我們可以通過 -exec 命令調用 adb 命令來把二進制文件導入安卓設備并且可以收集到結果信息。參考 這個 來在安卓設備上面執行。
$ go get -u
如果你通過 go get 命令獲取Go包,而這個包已經存在于本地的 GOPATH ,那么這個命令并不會幫你更新包。 -u 可以強制更新到最新版。
如果你是一個庫作者,你最好在你的安裝說明上加上 -u 參數,例如, golint 是這么做的:
$ go get -u github.com/golang/lint/golint
$ go get -d
如果你想clone一個代碼倉庫到 GOPATH 里面,跳過編譯和安裝環節,使用 -d 參數。這樣它只會下載包并且在編譯和安裝之前停止。
當需要clone虛擬網址代碼倉庫的時候,我經常使用這個命令來代替 git clone ,因為這樣可以把Go代碼自動放入合適的目錄下面。例如:
$ go get -d golang.org/x/oauth2/...
這樣可以克隆到 $GOPATH/src/golang.org/x/ouath2 目錄下面。假設 golang.org/x/oauth2 是一個虛擬網址,通過 go get 獲取這個代碼倉庫要比找出倉庫的真實地址(go.googlesource.com/oauth2)更簡單。
$ go get -t
如果你的測試包的有附加的依賴包, -t 可以一并下載測試包的依賴包。如果沒有加這個參數, go get 只會下載非測試包的依賴包。
$ go list -f
這個命令可以列出來Go的所有包,并且可以指定格式。這個寫腳本的時候很有用。
下面這個命令將會打印所有依賴的 runtime 包
go list -f ‘’ runtime [runtime/internal/atomic runtime/internal/sys unsafe]
來自:http://blog.cyeam.com/golang/2016/09/27/go-tool-flags