書名: Go Web編程作者名: 謝孟軍本章字?jǐn)?shù): 2018字更新時(shí)間: 2018-12-27 18:47:49
1.3 Go語言命令
Go語言命令
Go語言自帶有一套完整的命令操作工具,你可以通過在命令行中執(zhí)行g(shù)o來查看它們,如圖1.3所示。

圖1.3 Go語言命令顯示詳細(xì)的信息
這些命令對于我們平時(shí)編寫代碼非常有用,接下來就讓我們了解其中一些常用的命令。
go build
這個(gè)命令主要用于測試編譯。在包的編譯過程中,若有必要,會同時(shí)編譯與之相關(guān)聯(lián)的包。
● 如果是普通包,就像我們在第1.2節(jié)中編寫的mymath包那樣,當(dāng)你執(zhí)行g(shù)o build之后,它不會產(chǎn)生任何文件。如果你需要在$GOPATH/pkg 下生成相應(yīng)的文件,則要執(zhí)行g(shù)o install。
● 如果是main包,當(dāng)你執(zhí)行g(shù)o build之后,它就會在當(dāng)前目錄下生成一個(gè)可執(zhí)行文件。如果你需要在$GOPATH/bin下生成相應(yīng)的文件,需要執(zhí)行g(shù)o install,或者使用go build -o 路徑/a.exe。
● 如果某個(gè)項(xiàng)目文件夾下有多個(gè)文件,而你只想編譯某個(gè)文件,就可在go build之后加上文件名,例如go build a.go;go build命令默認(rèn)會編譯當(dāng)前目錄下的所有g(shù)o文件。
● 你也可以指定編譯輸出的文件名。例如第1.2節(jié)中的mathapp應(yīng)用,我們可以指定go build -o astaxie.exe,默認(rèn)情況是你的package名(非main包),或者是第一個(gè)源文件的文件名(main包)。
注:實(shí)際上,package名在Go語言規(guī)范里指代碼中“package”后使用的名稱,此名稱可以與文件夾名不同。默認(rèn)生成的可執(zhí)行文件名是文件夾名。
● go build會忽略目錄下以“_”或“.”開頭的go文件。
● 如果你的源代碼針對不同的操作系統(tǒng)需要不同的處理,那么你可以根據(jù)不同的操作系統(tǒng)后綴來命名文件。例如,有一個(gè)讀取數(shù)組的程序,它對于不同的操作系統(tǒng)可能有如下幾個(gè)源文件:
array_linux.go array_darwin.go array_windows.go array_freebsd.go
使用go build的時(shí)候會選擇性地編譯以系統(tǒng)名結(jié)尾的文件(Linux、darwin、Windows、freebsd)。例如,Linux系統(tǒng)下面編譯只會選擇array_linux.go文件,其他系統(tǒng)命名后綴文件全部忽略。
go clean
這個(gè)命令用來移除當(dāng)前源碼包里面編譯生成的文件。這些文件包括
_obj/ 舊的object目錄,由Makefiles遺留 _test/ 舊的test目錄,由Makefiles遺留 _testmain.go 舊的gotest文件,由Makefiles遺留 test.out 舊的test記錄,由Makefiles遺留 build.out 舊的test記錄,由Makefiles遺留 *.[568ao] object文件,由Makefiles遺留 DIR(.exe) 由go build產(chǎn)生 DIR.test(.exe) 由go test-c產(chǎn)生 MAINFILE(.exe) 由go build MAINFILE.go產(chǎn)生
筆者一般都是利用這個(gè)命令清除編譯文件,然后用github遞交源碼,在本機(jī)測試時(shí),這些編譯文件都是和系統(tǒng)相關(guān)的,但是對于源碼管理來說沒必要。
go fmt
有過C/C++編程經(jīng)驗(yàn)的讀者會知道,一些人經(jīng)常為代碼是采取K&R風(fēng)格還是ANSI風(fēng)格而爭論不休。在Go語言中,代碼則有標(biāo)準(zhǔn)的風(fēng)格。由于之前已經(jīng)有的一些習(xí)慣或原因,我們常將代碼寫成ANSI風(fēng)格或者其他更合適自己的格式,這為他人閱讀代碼時(shí)添加不必要的負(fù)擔(dān),所以Go語言強(qiáng)制了代碼格式(比如左花括號必須放在行尾),不按照此格式的代碼將不能編譯通過。為了減少浪費(fèi)在排版上的時(shí)間,Go 語言工具集中提供了一個(gè)go fmt命令,它可以幫你格式化所寫好的代碼文件,使你在寫代碼的時(shí)候不需要關(guān)心格式,只需要在寫完之后執(zhí)行g(shù)o fmt <文件名>.go,你的代碼就被修改成了標(biāo)準(zhǔn)格式。但是筆者平常很少用到這個(gè)命令,因?yàn)殚_發(fā)工具里面一般都帶有保存時(shí)自動格式化功能,這個(gè)功能其實(shí)在底層就是調(diào)用了go fmt。接下來我們將講述兩個(gè)工具,這兩個(gè)工具都自帶保存文件時(shí)自動化go fmt功能。
使用go fmt命令,更多的時(shí)候是用gofmt,而且需要參數(shù)-w,否則格式化結(jié)果不會寫入文件。使用gofmt -w src,可以格式化整個(gè)項(xiàng)目。
go get
這個(gè)命令用以動態(tài)獲取遠(yuǎn)程代碼包,目前支持的有BitBucket、GitHub、Google Code和 Launchpad。這個(gè)命令在內(nèi)部實(shí)際上分成兩步操作:第一步是下載源碼包,第二步是執(zhí)行g(shù)o install。下載源碼包的Go語言工具會自動根據(jù)不同的域名調(diào)用不同的源碼工具,對應(yīng)關(guān)系如下。
BitBucket (Mercurial Git) GitHub (Git) Google Code Project Hosting (Git, Mercurial, Subversion) Launchpad (Bazaar)
所以為了go get 能正常工作,你必須確保安裝了合適的源碼管理工具,并同時(shí)把這些命令加入你的PATH中。其實(shí)go get支持自定義域名的功能,具體參見go help remote。
go install
這個(gè)命令在內(nèi)部實(shí)際上分成兩步操作:第一步是生成結(jié)果文件(可執(zhí)行文件或者.a包),第二步會把編譯好的結(jié)果移到$GOPATH/pkg或者$GOPATH/bin。
go test
執(zhí)行這個(gè)命令,會自動讀取源碼目錄下名為*_test.go的文件,生成并運(yùn)行測試用的可執(zhí)行文件。輸出的信息類似如下內(nèi)容。
ok archive/tar 0.011s FAIL archive/zip 0.022s ok compress/gzip 0.033s ...
默認(rèn)情況下,不需要任何參數(shù),它會自動把你的源碼包下面所有的test文件測試完畢,當(dāng)然你也可以帶上參數(shù),詳細(xì)內(nèi)容請參考go help testflag。
go doc
很多人說Go語言不需要任何第三方文檔,例如,chm手冊之類的(其實(shí)筆者已經(jīng)做了一個(gè)chm手冊),因?yàn)樗鼉?nèi)部就有一個(gè)很強(qiáng)大的文檔工具。
如何查看相應(yīng)的package文檔呢?如果是builtin包,那么執(zhí)行g(shù)o doc builtin;如果是http包,那么執(zhí)行g(shù)o doc net/http;查看某一個(gè)包里面的函數(shù),則執(zhí)行g(shù)odoc fmt Printf;也可以查看相應(yīng)的代碼,執(zhí)行g(shù)odoc -src fmt Printf。
通過命令行的方式執(zhí)行 godoc -http=:端口號,比如godoc -http=:8080。然后在瀏覽器中打開127.0.0.1:8080,你將會看到一個(gè)golang.org的本地副本,通過它可查詢pkg文檔等其他內(nèi)容。如果你設(shè)置了 GOPATH,在 pkg 分類下,不但會列出標(biāo)準(zhǔn)包的文檔,還會列出本地 GOPATH 中所有項(xiàng)目的相關(guān)文檔,這對于經(jīng)常被限制訪問的用戶來說是一個(gè)不錯(cuò)的選擇。
其他命令
Go語言還提供了很多其他的工具,例如下面這些。
go fix 用來修復(fù)以前老版本的代碼到新版本,例如go1之前老版本的代碼轉(zhuǎn)化到go1 go version 查看go當(dāng)前的版本 go env 查看當(dāng)前go的環(huán)境變量 go list 列出當(dāng)前全部安裝的package go run 編譯并運(yùn)行Go語言程序
以上這些工具還有很多參數(shù)沒有一一介紹,用戶可以使用go help 命令獲取更詳細(xì)的幫助信息。
- Spring Boot 2實(shí)戰(zhàn)之旅
- Spring Cloud Alibaba核心技術(shù)與實(shí)戰(zhàn)案例
- 華為HMS生態(tài)與應(yīng)用開發(fā)實(shí)戰(zhàn)
- 算法精粹:經(jīng)典計(jì)算機(jī)科學(xué)問題的Java實(shí)現(xiàn)
- INSTANT Sencha Touch
- Node.js Design Patterns
- Go語言精進(jìn)之路:從新手到高手的編程思想、方法和技巧(1)
- ASP.NET Core 2 Fundamentals
- 持續(xù)輕量級Java EE開發(fā):編寫可測試的代碼
- Learning Hadoop 2
- Instant Debian:Build a Web Server
- Kotlin Programming By Example
- Android Studio Cookbook
- PHP+MySQL動態(tài)網(wǎng)站開發(fā)從入門到精通(視頻教學(xué)版)
- PyQt編程快速上手