go test 如何输出到控制台_GO笔记之GO命令快速体验
上篇文章利用go run和go build命令分析介紹了GO的編譯執(zhí)行流程。GO提供給我們的命令當(dāng)然遠(yuǎn)不止這兩個。本文將在所能及的范圍內(nèi),盡量地介紹GO提供的所有命令,從而實現(xiàn)對它們有個整體的認(rèn)識。
概述
除了gofmt與godoc外,GO中的命令一般都可通過go命令調(diào)用,這些命令可理解為go的子命令,查看下命令列表,如下:
$ go Go is a tool for managing Go source code. Go是管理Golang源碼的工具Usage: 使用方式:go <command> [arguments]go <命令> [參數(shù)]The commands are: 涉及的命令包括:bug start a bug report提交bug報告,執(zhí)行后會開啟瀏覽器并轉(zhuǎn)到github的issue,當(dāng)前的配置與環(huán)境都會自動填寫到issue中build compile packages and dependencies編譯源碼和依賴包clean remove object files and cached files清理文件,如測試與編譯中生成或緩存的文件doc show documentation for package or symbol可用于顯示包、接口和函數(shù)等的文檔env print Go environment information打印當(dāng)前的環(huán)境變量信息fix update packages to use new APIs可用于go新舊版本之間的代碼遷移,修正代碼兼容問題fmt gofmt (reformat) package sources按規(guī)范格式化源碼generate generate Go files by processing source掃描源碼注釋,類似//go:generate command argument...實現(xiàn)生成go文件get download and install packages and dependencies下載并安裝包和依賴install compile and install packages and dependencies編譯并安裝包和依賴list list packages or modules列出包或模塊的信息mod module maintenance用于模塊的管理維護(hù)run compile and run Go program編譯與執(zhí)行Go程序test test packages測試包tool run specified go tool運行g(shù)o提供的一些特定工具,比如pprofversion print Go version打印go版本信息vet report likely mistakes in packages檢查與報告代碼包中的錯誤...輸出的介紹大致翻譯了下,其中部分命令也作了些介紹。除了go的子命令,go tool下也有些更底層的命令,執(zhí)行g(shù)o tool即可查看:
$ go tool addr2line 可以調(diào)用棧的地址轉(zhuǎn)化為文件和行號 asm 和匯編有關(guān)的命令,沒搞清楚如何使用 buildid 似乎用在編譯時,根據(jù)文件內(nèi)容生成hash cgo 可幫助我們實現(xiàn)在GO中調(diào)用C語言代碼 compile 用于編譯源碼生成.o文件 cover 可用于分析測試覆蓋率 dist 幫助引導(dǎo)、構(gòu)建和測試go doc 測試下來似乎和go doc效果一樣,都是用于文章管理 fix 用于解決不同版本間代碼不兼容問題,和go fix作用一樣 link 用于庫的鏈接 nm 可列出如對象文件.o,可執(zhí)行文件或.a庫文件中的函數(shù)變量符號等信息 objdump 反匯編命令 pack 似乎是個打包壓縮命令 pprof 自帶的性能分析工具 test2json 用于把測試文件轉(zhuǎn)化可讀的json格式 tour 啟動本地的tour教程,可見GO團(tuán)隊真的很用心 trace 可用于問題診斷與調(diào)式的工具go tool的輸出默認(rèn)沒有任何文字說明,這里的介紹是我收集總結(jié)出來的,可能有些錯誤。
總體而言,我把GO中命令分為幾個大類:
- 源碼編譯
- 包的管理
- 代碼規(guī)范
- 測試相關(guān)
- 調(diào)試優(yōu)化
- 其他命令
GO的命令很多,很難在一篇文章中把每個都介紹清楚。接下來只做些簡單演示說明,詳細(xì)的介紹待以后有了具體場景在詳細(xì)說明。
源碼編譯
go build、go run 兩個命令可歸于源碼編譯類的命令,是入門學(xué)習(xí)首先要掌握的,故而在前篇文章已經(jīng)做了詳細(xì)介紹。
go build用于編譯可執(zhí)行文件和庫文件,參數(shù)可以是源碼目錄、.go文件。演示如下:
$ go build # 目錄 $ go build main.go # .go文件 $ go build main.go math.go data.go # .go文件列表go run和build有很多相似點,它們都會編譯源碼。不同的是,go run只能用于可執(zhí)行源碼(即main包源碼)的編譯。接收參數(shù)為.go文件。演示如下:
$ go run main.go $ go run main.go math.go data.go詳細(xì)了解,可以看下 詳解GO的編譯執(zhí)行流程 這篇介紹。
關(guān)于編譯,go tool還有一些更細(xì)節(jié)的命令,比如compile、link等。有興趣可以去了解下。
包的管理
GO的包管理是由語言包自帶,這點不同于其他語言,如Java、Python、PHP等。從當(dāng)前我所了解的來看,GO沒有提供包管理倉庫,而是直接使用的版本管理系統(tǒng)作為倉庫,支持如git、svn、mercurial等。而用于包管理的命令有g(shù)o install、go get、go list等。
go install用于源碼包的編譯與安裝。雖然這里也涉及到編譯,但從名字就可以看出,該命令重在強(qiáng)調(diào)安裝。之前build命令在編譯非main包會生成緩存文件,main包會生成執(zhí)行文件并拷貝到當(dāng)前目錄。而install會將它們安裝到指定的文件。假設(shè)有名為math的包,執(zhí)行如下命令:
$ go install math # 非main包,最終生成文件 $GOPATH/pkg/xxx/xxx/math.a。 $ go install entry # 是main包,最終生成文件 $GOBIN/entrygo get用于從互聯(lián)網(wǎng)安裝更新包和依賴,類似于其他語言包管理器的install。不同于install,它多出網(wǎng)絡(luò)下載這步,大概可理解為 go get 等價于 git/svn等下載 + git install。我們可以演示下從http://github.com/PuerkitoBio/goquery下載安裝goquery的過程,如下:
$ go get -v github.com/PuerkitoBio/goquery golang.org/x/net/html/atom golang.org/x/net/html github.com/andybalholm/cascadia github.com/PuerkitoBio/goquery從上面可以看出,go get不僅下載了goquery,還下載了相應(yīng)的依賴。執(zhí)行完成后,GOPATH目錄下可以找到goquery的源碼與編譯后的.a庫文件。
go list可用于輸出包的信息,接口的參數(shù)和在源碼中import的路徑相同,下面演示一些案例:
$ go list fmt # 查看某包 fmt $ go list fmt net/http # 查看多個包 fmt net/http $ go list --json fmt # 查看包的具體信息 {"Dir": "/usr/local/go/src/fmt","ImportPath": "fmt","Name": "fmt","Doc": "Package fmt implements formatted I/O with functions analogous to C's printf and scanf.","Target": "/usr/local/go/pkg/darwin_amd64/fmt.a","Root": "/usr/local/go","Match": ["fmt"],"Goroot": true,"Standard": true,"GoFiles": ["doc.go",..."scan.go"],"Imports": ["errors",..."unicode/utf8"],"Deps": ["errors",..."unicode/utf8","unsafe"],"TestGoFiles": ["export_test.go"],"XTestGoFiles": ["example_test.go",..."stringer_test.go"],"XTestImports": ["bufio",..."unicode/utf8"] }詳情信息部分展示內(nèi)容比較多,包含源碼路徑、導(dǎo)入路徑、依賴了哪些包等一系列信息。
代碼規(guī)范
這類命令可以幫助我們規(guī)范代碼的格式,減少代碼發(fā)生錯誤的幾率,其中主要有g(shù)o fmt、go vet和go fix三個命令。
go fmt的作用是代碼的格式化。為了讓我們把更多時間花在開發(fā)工作上,GO官方制定了標(biāo)準(zhǔn)的代碼規(guī)范并go fmt實現(xiàn)規(guī)范代碼。假設(shè)有main.go文件內(nèi)容如下:
package mainfunc main() {a := x + y }我們只需執(zhí)行g(shù)o fmt main.go文件,然后再次打開main.go文件:
package mainfunc main() {a := x + y }格式化已經(jīng)完成。關(guān)于代碼格式化還有一個更具體的命令:gofmt,go fmt是它的某個特殊形式:gofmt -l -w。
go vet是一個用于檢查GO語言靜態(tài)語法的工具。GO語言的語法是非常嚴(yán)格的,如不能定義未使用的變量、變量類型必須顯式轉(zhuǎn)化等等。示例,假設(shè)有main.go文件內(nèi)容如下:
package mainfunc main() {a := 1 + 2b := 1 }使用go vet執(zhí)行源碼檢查,輸出結(jié)果如下:
$ go vet main.go # command-line-arguments [command-line-arguments.test] ./main.go:4:5: a declared and not used ./main.go:5:5: b declared and not used我們被告知,變量a和b聲明但并沒有使用。
go fix主要用于處理代碼的兼容性問題,例如go1之前老版本的代碼轉(zhuǎn)化到go1。但是有點遺憾的是,沒找到該命令的演示案例。我們平時應(yīng)該很少用到。
測試相關(guān)
GO也提供與相關(guān)的命令,為我們提供了一條方便驗證我們代碼的途徑。與測試有關(guān)的命令有g(shù)o test、go tool cover 和 go tool test2json。
go test可用于運行測試代碼,以此驗證程序邏輯的正確性能。具體演示下,示例代碼包含兩部分,分別是功能代碼和測試代碼。功能代碼在math.go文件中,如下:
package mathfunc Add(x, y int) int {return x + y }測試用例的代碼在math_test.go文件中,如下:
package mathimport "testing"func Test_Add(t *testing.T) {r := Add(1, 2)if r != 3 {t.FailNow()} }接下來我們可以執(zhí)行g(shù)o test命令啟動測試用例,如下:
$ go test math_test.go math.go ok command-line-arguments結(jié)果顯示,測試執(zhí)行成功,Add函數(shù)功能正常。我們可以把測試代碼編譯成可執(zhí)行文件,如下:
$ go test math_test.go math.go -o math.test查看下會發(fā)現(xiàn)此時目錄下多出了編譯好的math.test可執(zhí)行測試文件。
go cover可用于分析測試覆蓋率。比如上面的測試案例,我們可以生成覆蓋率文件,如下:
$ go test *.go -coverprofile=coverage.outgo cover 提供多種方式分析測試覆蓋率,這里演示下如何用html展示測試結(jié)果,如下:
$ go tool cover --html=size_coverage.out顯示測試覆蓋率為100%。我們這里的測試用例比較簡單,所以到達(dá)了全面覆蓋。
go tool test2json可用于將go test測試結(jié)果轉(zhuǎn)化為json格式。這里需要使用之前生成的測試執(zhí)行文件,示例如下:
$ go tool test2json ./math.test -test.v {"Action":"run","Test":"Test_Add"} {"Action":"output","Test":"Test_Add","Output":"=== RUN Test_Addn"} {"Action":"output","Test":"Test_Add","Output":"--- PASS: Test_Add (0.00s)n"} {"Action":"pass","Test":"Test_Add"} {"Action":"output","Output":"PASSn"} {"Action":"pass"}測試結(jié)果以json格式打印出來。雖然我對專業(yè)的測試不太了解,但是也明白結(jié)構(gòu)化的輸出是比較容易程序化分析的。
調(diào)試優(yōu)化
完成代碼開發(fā)后,可能時刻會遇到一些bug或者性能問題。GO提供了go tool pprof、go tool trace、go tool addr2line和go tool nm等一系列命令,可用于代碼調(diào)試優(yōu)化。
go tool pprof可用于幫助我們分析程序收集的性能數(shù)據(jù),比如CPU、內(nèi)存等數(shù)據(jù)。以官方提供的示例為例吧,博客地址在 博客。示例代碼在benchgraffiti。
go tool trace 可用于追蹤程序執(zhí)行情況。go tool pprof可以通過cpu和內(nèi)存數(shù)據(jù)分析出程序的瓶頸。
go tool addr2line可以將地址轉(zhuǎn)化對應(yīng)源碼的文件和行號,非常方便的便于我們調(diào)式問題。
具體的案例就不演示了。這部分的命令稍微有點復(fù)雜,待后面有了具體案例再來補充。
其他命令
GO中還提供了很多輔助命令。這些命令有g(shù)o bug、go doc、go tool tourl等。
go bug會直接啟動瀏覽器并進(jìn)入github的go項目的issue之下,還會把用戶當(dāng)前環(huán)境信息自動添加到issue中。如下執(zhí)行g(shù)o bug之后跳轉(zhuǎn)的頁面:
由此可見,GO的開發(fā)團(tuán)隊真的非常用心,做了很多簡化我們工作的事情。
go doc為我們提供了快速查看文檔的途徑,比如查看fmt文檔,我們只需執(zhí)行g(shù)o doc fmt,fmt相關(guān)的文檔便會輸出到控制臺。我們也可以像官網(wǎng)文檔那樣用瀏覽器查看文檔,只需執(zhí)行g(shù)odoc -http=:6060,便會啟動一個本地的web服務(wù)。我們訪問localhost:6060就能看到一個幾乎和官網(wǎng)一樣的頁面,示例如下:
go tool tourl是官方提供的本地搭建tour教程的方式。我們只需執(zhí)行g(shù)o tool tour便會自動啟動瀏覽器并進(jìn)入教程首頁。
到這里我們可以發(fā)現(xiàn),即使由于一些原因使我們無法訪問GO的官網(wǎng),但有了這些工具,我們也可以愉快地進(jìn)行GO的學(xué)習(xí)。
總結(jié)
本篇文章以GO命令的快速體驗為目標(biāo),概要式地介紹了幾乎所有的命令。在對它們有了基本認(rèn)識后,在以后遇到問題時,我們才能想到它們,以及更快地掌握和使用它們。
總結(jié)
以上是生活随笔為你收集整理的go test 如何输出到控制台_GO笔记之GO命令快速体验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高并发解决方法
- 下一篇: Android ToolBar 使用完全