本文簡單介紹 Golang 提供的命令。
我們執行 go help [command]
可以查看具體命令的幫助信息。
執行 go help
可以看到,Golang 提供的命令有下列所示:
build compile packages and dependencies
clean remove object files
doc show documentation for package or symbol
env print Go environment information
bug start a bug report
fix run go tool fix on packages
fmt run gofmt on package sources
generate generate Go files by processing source
get download and install packages and dependencies
install compile and install packages and dependencies
list list packages
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet run go tool vet on packages
下面逐一介紹
go build
命令樣式:go build [-o output] [-i] [build flags] [packages]
這個命令用于編譯指定的源碼文件或代碼包以及它們的依賴包。編譯時,會自動忽略以 '_test.go' 文件名結尾的文件。
-o
指定輸出文件名,只支持在編譯單個 package 時使用 。
-i
安裝目標 package 所需的依賴
build, clean, get, install, list, run, test 這些命令共享以下的 flags,這些 flags 在不同的命令下語義不同
-a
強行對所有涉及到的代碼包進行重新構建,即使它們已經是最新的了。
-n
打印編譯期間所用到的其它命令,但是并不真正執行它們。
-p n
指定編譯過程中執行各任務的并行數量(確切地說應該是并發數量)。在默認情況下,該數量等于CPU的邏輯核數。但是在darwin/arm平臺(即iPhone和iPad所用的平臺)下,該數量默認是1。n為正整數
-race
開啟競態條件的檢測。不過此標記目前僅在 linux/amd64
、freebsd/amd64
、darwin/amd64
和 windows/amd64
平臺下受到支持。
-v
打印出那些被編譯的代碼包的名字。
-work
打印出編譯時生成的臨時工作目錄的路徑,并在編譯結束時保留它。在默認情況下,編譯結束時會刪除該目錄。
-x
打印編譯期間所用到的其它命令。注意它與 -n 標記的區別。
-asmflags 'flag list'
此標記可以后跟另外一些標記,如 -D、-I、-S 等。這些后跟的標記用于控制 Go 語言編譯器編譯匯編語言文件時的行為。
-buildmode mode
此標記用于指定編譯模式,使用方式如 -buildmode=default。此標記支持的編譯模式目前有 6 種。借此,我們可以控制編譯器在編譯完成后生成靜態鏈接庫 .a 文件、動態鏈接庫 .so 文件或可執行文件(如 Windows下的 .exe )。
-compiler name
使用指定的 compiler,比如 runtime.Compiler 中的 gccgo 或 gc。
-gccgoflags 'arg list'
指定 gccgo 執行時所需的參數
-gcflags 'arg list'
指定需要傳遞給 go tool compile
命令的參數列表。
比如:
go build -gcflags "-N -l" -o test test.go
-ldflags 'flag list'
指定需要傳遞給 go tool link
命令的參數列表
-linkshared
鏈接 -buildmode=shared 模式下指定的共享庫
go clean
執行 go clean
命令會刪除掉執行其它命令時產生的一些文件和目錄,包括:
使用 go build
命令時在當前代碼包下生成的與包名同名或者與 Go 源碼文件同名的可執行文件。
執行 go test
命令并加入-c 標記時在當前代碼包下生成的以包名加“.test”后綴為名的文件。
還有一些目錄和文件是在編譯 Go 或 C 源碼文件時留在相應目錄中的。包括:“_obj” 和 “_test” 目錄,名稱為 “_testmain.go”、“test.out”、“build.out”或 “a.out” 的文件,名稱以 “.5”、“.6”、“.8”、“.a”、“.o” 或 “.so” 為后綴的文件。這些目錄和文件是在執行 go build
命令時生成在臨時目錄中的。
go clean [-i] [-r] [-n] [-x] [build flags] [packages]
-r
刪除由 go install
命令所安裝的可執行目標文件及其所有依賴的文件。
-i
刪除由 go install
命令所安裝的可執行目標文件
go doc
打印附于 Go 語言程序實體上的文檔。我們可以通過把程序實體的標識符作為該命令的參數來達到查看其文檔的目的。
go doc [-u] [-c] [package|[package.]symbol[.method]]
-c
加入此標記后會使go doc命令區分參數中字母的大小寫。
-cmd
打印出main包中的可導出的程序實體(其名稱的首字母大寫)的文檔。
-u
打印出不可導出的程序實體(其名稱的首字母小寫)的文檔。
go env
打印 Go 語言的環境信息。
命令格式:go env [var ...]
$ go env GOARCH="amd64" # 程序構建環境的目標計算架構。
GOBIN="" # 存放可執行文件的目錄的絕對路徑。
GOCHAR="" # 程序構建環境的目標計算架構的單字符標識。1.5以后的版本沒有了GOEXE="" # 可執行文件的后綴。
GOHOSTARCH="amd64" # 程序運行環境的目標計算架構。
GOHOSTOS="linux" # 程序運行環境的目標操作系統。
GOOS="linux" # 程序構建環境的目標操作系統。GOPATH="/home/lbb/workspace/go #工作區目錄的絕對路徑。
GORACE="" #用于數據競爭檢測的相關選項。
GOROOT="/usr/local/go" # Go語言的安裝目錄的絕對路徑。GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" # Go工具目錄的絕對路徑。GO15VENDOREXPERIMENT="1"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"CXX="g++"CGO_ENABLED="1" # 指明cgo工具是否可用的標識。
go fix
用來修復以前老版本的代碼到新版本。它其實是命令 go tool fix
的簡單封裝。這甚至比 go fmt
命令對 gofmt
命令的封裝更簡單。像其它的 Go 命令一樣,go fix
命令會先對作為參數的代碼包導入路徑進行驗證,以確保它是正確有效的。
-diff
不將修正后的內容寫入文件,而只打印修正前后的內容的對比信息到標準輸出。
-r
只對目標源碼文件做有限的修正操作。該標記的值即為允許的修正操作的名稱。多個名稱之間用英文半角逗號分隔。
-force
使用此標記后,即使源碼文件中的代碼已經與Go語言的最新版本相匹配了,也會強行執行指定的修正操作。該標記的值就是需要強行執行的修正操作的名稱,多個名稱之間用英文半角逗號分隔。
go fmt
命令格式:go fmt [-n] [-x] [packages]
該命令用于對 .go 源文件進行格式化。
-n
打印編譯期間所用到的其它命令,但是并不真正執行它們。
-x
可以看到go get命令執行過程中所使用的所有命令。
go generate
是一個你可以用來自動自成 Go 代碼的命令,你可以結合例如 jsonenums (一個用于為枚舉類型自動生成 JSON 編組樣板代碼的類庫)這樣的元編程來使用 go generate
快速自動實現重復乏味代碼的編寫。在 Go 標準類庫里面已經有大量可以用于解析 AST 的接口,而 AST 使得編寫元編程工具更簡單,更容易。
go get
下載或更新指定的代碼包及其依賴包,并對它們進行編譯和安裝。
go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]
-d
讓命令程序只執行下載動作,而不執行安裝動作。
-f
僅在使用 -u 標記時才有效。該標記會讓命令程序忽略掉對已下載代碼包的導入路徑的檢查。如果下載并安裝的代碼包所屬的項目是你從別人那里 Fork 過來的,那么這樣做就尤為重要了。
-fix
讓命令程序在下載代碼包后先執行修正動作,而后再進行編譯和安裝。之前解決相關性或建設中的代碼。
-insecure
允許命令程序使用非安全的scheme(如HTTP)去下載指定的代碼包。如果你用的代碼倉庫(如公司內部的 Gitlab)沒有HTTPS支持,可以添加此標記。請在確定安全的情況下使用它。
-t
讓命令程序同時下載并安裝指定的代碼包中的測試源碼文件中依賴的代碼包。
-u
讓命令利用網絡來更新已有代碼包及其依賴包。默認情況下,該命令只會從網絡上下載本地不存在的代碼包,而不會更新已有的代碼包。
-x
可以看到 go get
命令執行過程中所使用的所有命令
go get
還有一個很值得稱道的功能。在使用它檢出或更新代碼包之后,它會尋找與本地已安裝 Go 語言的版本號相對應的標簽(tag)或分支(branch)。比如,本機安裝 Go 語言的版本是 1.x,那么 go get
命令會在該代碼包的遠程倉庫中尋找名為 “go1” 的標簽或者分支。如果找到指定的標簽或者分支,則將本地代碼包的版本切換到此標簽或者分支。如果沒有找到指定的標簽或者分支,則將本地代碼包的版本切換到主干的最新版本。
擴展顯示下載進度條修改 git clone
命令, 添加 --progress
選項, 使其輸出進度修改cmd.Run() 執行的地方, 使其將輸出定位到標準輸出流上
go install
編譯并安裝指定的代碼包及它們的依賴包。實際上,go install
命令只比 go build
命令多做了一件事,即:安裝編譯后的結果文件到指定目錄。
go install [build flags] [packages]
go list
命令的作用是列出指定的代碼包的信息。與其他命令相同,我們需要以代碼包導入路徑的方式給定代碼包。被給定的代碼包可以有多個。這些代碼包對應的目錄中必須直接保存有Go語言源碼文件,其子目錄中的文件不算在內。否則,代碼包將被看做是不完整的。go list [-e] [-f format] [-json] [build flags] [packages]
go run
命令可以編譯并運行命令源碼文件。由于它其中包含了編譯動作,因此它也可以接受所有可用于 go build 命令的標記。除了標記之外,go run 命令只接受 Go 源碼文件作為參數,而不接受代碼包。與 go build 命令和 go install 命令一樣,go run 命令也不允許多個命令源碼文件作為參數,即使它們在同一個代碼包中也是如此。而原因也是一致的,多個命令源碼文件會都有 main 函數聲明。
go run [build flags] [-exec xprog] gofiles... [arguments...]
如果命令源碼文件可以接受參數,那么在使用 go run 命令運行它的時候就可以把它的參數放在它的文件名后面,像這樣:go run main.go -p ~/golang/gotest
。
go test
-c
生成用于運行測試的可執行文件,但不執行它。這個可執行文件會被命名為“pkg.test”,其中的“pkg”即為被測試代碼包的導入路徑的最后一個元素的名稱。
-i
安裝/重新安裝運行測試所需的依賴包,但不編譯和運行測試代碼。
-o
指定用于運行測試的可執行文件的名稱。追加該標記不會影響測試代碼的運行,除非同時追加了標記-c或-i。
go tool
go tool [-n] command [args...]
go tool pprof
命令可以用來交互式的訪問概要文件的內容。命令將會分析指定的概要文件,并會根據我們的要求為我們提供高可讀性的輸出信息。
go tool cgo
這個工具可以使我們創建能夠調用 C 語言代碼的 Go 語言源碼文件。這使得我們可以使用 Go 語言代碼去封裝一些 C 語言的代碼庫,并提供給 Go 語言代碼或項目使用。
go version
查看 Go 版本
go vet
是一個用于檢查 Go 語言源碼中靜態錯誤的簡單工具
go vet [-n] [-x] [build flags] [packages]
go vet
是 go tool vet
命令的簡單封裝。它會首先載入和分析指定的代碼包,并把指定代碼包中的所有 Go 語言源碼文件和以 “.s” 結尾的文件的相對路徑作為參數傳遞給 go tool vet
命令。
-n
會讓命令在執行過程中打印用到的系統命令,但不會真正執行它們。
-x
既打印命令又執行命令。
-r
包括當前代碼包的所有依賴包的上述目錄和文件。