Golang 命令

本文簡單介紹 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/amd64windows/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 vetgo tool vet 命令的簡單封裝。它會首先載入和分析指定的代碼包,并把指定代碼包中的所有 Go 語言源碼文件和以 “.s” 結尾的文件的相對路徑作為參數傳遞給 go tool vet命令。

-n
會讓命令在執行過程中打印用到的系統命令,但不會真正執行它們。

-x
既打印命令又執行命令。

-r
包括當前代碼包的所有依賴包的上述目錄和文件。

Golang

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 主要來源:《Go Web編程》 1、go build 作用:compile packages and depend...
    molscar閱讀 366評論 0 0
  • golang 命令詳解 github地址 1. build 編譯包和依賴項 2. clean 刪除對象文件和緩存的...
    趙威杰閱讀 2,741評論 0 1
  • Golang具有一套可以構建和處理go源代碼的程序,作為命令行工具,這些程序也并非直接運行,而是由go程序調用。運...
    云時代的運維開發閱讀 3,454評論 0 0
  • 一、Go的源碼文件 Go 的源碼文件分類: 如上圖,分為三類: 1、命令源碼文件: 聲明自己屬于 main 代碼包...
    qfliweimin閱讀 451評論 0 0
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學已經沒多少時間了。班主任說已經安排了三個家長分享經驗。 放學鈴聲...
    飄雪兒5閱讀 7,540評論 16 22