golang 命令詳解
1. build 編譯包和依賴項
2. clean 刪除對象文件和緩存的文件
3. doc與godoc 顯示包文檔
4. env 打印Go語言的環(huán)境信息
5. fix與go tool fix 會把指定包中的所有Go語言源碼文件中舊版本代碼修正為新版本的代碼,升級版本時非常有用
6. fmt與gofmt 格式化go源文件
7. generate
8. get 下載并安裝包和依賴(下載包和依賴,并對它們進行編譯安裝)
9. install 編譯并安裝指定包及它們的依賴包,
10. list 列出包和模塊信息
11. mod 管理模塊
12. run 編譯并運行Go程序
13. test 測試包
14. tool 運行指定的go工具
15. version 查看當前go語言版本
16. vet 報告包中可能出現(xiàn)的錯誤
1. build 編譯包和依賴項
build 編譯包和依賴項
usage: go build [-o output] [-i] [build flags] [packages]
用法: go build [-o output] [-i] [build 參數(shù)] [包]
可選參數(shù):
-o 編譯單個包才能使用(不能同時對多個代碼包進行編譯),例如我們經(jīng)常重新命名可執(zhí)行文件名字
-i 標志安裝的包是目標的依賴項
-a 強制重新構建已經(jīng)更新的包
-n 打印編譯時執(zhí)行的命令,但不真正執(zhí)行
-p 開啟并發(fā)編譯,默認情況下該值為CPU邏輯核數(shù)
-race 開啟競態(tài)檢測,只支持linux/amd64、freebsd/amd64、darwin/amd64和windows/amd64.
-msan 內(nèi)存掃描
-v 編譯包時打印包的名稱
-work 編譯時打印臨時工作目錄的名稱,退出時不刪除它
-x 打印編譯時執(zhí)行的命令(打印編譯時會用到的所有命令)
-asmflags '[pattern=]arg list',傳遞給每個go工具asm調(diào)用的參數(shù)
-buildmode mode 使用編譯模式, 更多信息請參見“go help buildmode”
-compiler name 設置編譯時使用編譯器名,編譯器名稱只有2個選項(gccgo或gc)
-gccgoflags '[pattern=]arg list' 傳遞每個gccgo編譯器/鏈接器調(diào)用的參數(shù)列表
-gcflags '[pattern=]arg list' 用于指定需要傳遞給go tool compile命令的參數(shù)的列表,更多信息參見(go tool compile)
-installsuffix suffix 為了使當前的輸出目錄與默認的編譯輸出目錄分離,可以使用這個標記.此標記的值會作為結果文件的父目錄名稱的后綴.其實,如果使用了-race標記,這個標記會被自動追加且其值會為race.如果我們同時使用了-race標記和-installsuffix,那么在-installsuffix標記的值的后面會再被追加_race,并以此來作為實際使用的后綴
-ldflags '[pattern=]arg list' 用于指定需要傳遞給go tool link命令的參數(shù)的列表
-linkshared
-mod mode 模塊下載方式,只有2個選項(readonly或vendor),更多信息請參見(go help modules)
-pkgdir dir 設置包目錄.編譯器會只從該目錄中加載代碼包的歸檔文件,并會把編譯可能會生成的代碼包歸檔文件放置在該目錄下
-tags 'tag list'
-toolexec 'cmd args' 用于在編譯期間使用一些Go語言自帶工具(如vet漾岳、asm等)的方式
示例:
go build [1個或多個go源文件, 或者包名, 或者包所在目錄]
go build a.go b.go main.go
go build main.go
go build hello
# 把main.go編譯成可執(zhí)行文件hello.exe
go build -o hello.exe main.go
# 打印編譯時執(zhí)行的命令,但不真正執(zhí)行
go build -n
# 答應工作目錄
go build -work
2. clean 刪除對象文件和緩存的文件
clean 刪除執(zhí)行其他命令時產(chǎn)生的文件侧到、目錄和緩存文件.
具體地說.clean 會刪除從導入路徑對應的源碼目錄中,刪除以下這些文件和目錄
_obj/ old object directory, left from Makefiles
_test/ old test directory, left from Makefiles
_testmain.go old gotest file, left from Makefiles
test.out old test log, left from Makefiles
build.out old test log, left from Makefiles
*.[568ao] object files, left from Makefiles
DIR(.exe) from go build
DIR.test(.exe) from go test -c
MAINFILE(.exe) from go build MAINFILE.go
*.so from SWIG
usage: go clean [clean flags] [build flags] [packages]
用法: go clean [clean 參數(shù)] [build參數(shù)] 包
可選參數(shù):
-i 會刪除安裝當前代碼包所有產(chǎn)生的所有文件, 如果當前包是一個普通包(不是main包),則結果文件指的就是在工作區(qū)的pkg目錄的相應目錄下的歸檔文件.如果當前代碼包中只包含一個命令源碼文件, 則刪除當前目錄和在工作區(qū)的bin目錄下的可執(zhí)行文件和測試文件.
-n 打印clean執(zhí)行的命令,但不真正執(zhí)行
-r 刪除當前代碼包和所有的依賴包產(chǎn)生的文件抱婉、目錄和緩存文件
-x 打印clean執(zhí)行的刪除命令
-cache 刪除所有 go build 的緩存
-testcache 刪除當前包所有的測試結果
3. doc 顯示包文檔
doc與godoc 顯示包或符號的文檔, 更多用法請參考(godoc -h)
usage: go doc [-u] [-c] [package|[package.]symbol[.methodOrField]]
用法: go doc [-u] [-c] [package|[package.]symbol[.methodOrField]]
可選參數(shù):
-c 區(qū)分參數(shù)包名的大小寫.默認情況下,包名是大小寫不敏感的
-cmd 打印 main 包文檔, 默認情況下不會打印 main 包文檔
-u 打印出所有的文檔(同事包含可導出和不可導出實體)
示例:
# 顯示 hellomod 包文檔,(注意 hellomod 和 Hellomod是不同的包)
go doc -c hellomod
4. env 打印Go語言的環(huán)境信息
env 打印Go語言的環(huán)境信息
usage: go env [-json] [var ...]
用法: go env [-json] [變量 ...]
可選參數(shù):
-json 以json格式打印環(huán)境信息
示例:
# 以json格式打印所有環(huán)境信息
go env -json
# 以json格式只打印 GOOS 程序構建環(huán)境的目標操作系統(tǒng)
go env -json GOOS
# 打印所有環(huán)境信息
go env
# 只打印 GOOS 程序構建環(huán)境的目標操作系統(tǒng)
go env GOOS
5. fix與go tool fix 會把指定包中的所有Go語言源碼文件中舊版本代碼修正為新版本的代碼,升級版本時非常有用
fix 會把指定包中的所有Go語言源碼文件中舊版本代碼修正為新版本的代碼
usage: go fix [packages]
示例:
go fix testmod
go tool fix -h
usage: go tool fix [-diff] [-r fixname,...] [-force fixname,...] [path ...]
-diff 不將修正后的內(nèi)容寫入文件, 而只打印修正前后的內(nèi)容的對比信息到標準輸出
-force string 使用此參數(shù)后, 即使源碼文件中的代碼已經(jīng)與Go語言的最新版本相匹配, 也會強行執(zhí)行指定的修正操作.該參數(shù)值就是需要強行執(zhí)行的修正操作的名稱,多個名稱之間用英文半角逗號分隔
-r string 只對目標源碼文件做有限的修正操作.該參數(shù)的值即為允許的修正操作的名稱.多個名稱之間用英文半角逗號分隔
6. fmt與gofmt 格式化go源文件
Go 開發(fā)團隊不想要 Go 語言像許多其它語言那樣總是在為代碼風格而引發(fā)無休止的爭論,浪費大量寶貴的開發(fā)時間,因此他們制作了一個工具:go fmt(gofmt)
fmt與gofmt 命令 格式化go源文件,fmt命令實際"gofmt -l -w"命令之上做了一層包裝,我們一般使用
usage: go fmt [-n] [-x] [packages]
用法: go fmt [-n] [-x] 包
可選參數(shù):
-x 打印執(zhí)行的命令
-n 打印執(zhí)行的命令,但不真正執(zhí)行
示例:
# 格式化 testmod 包, 并顯示執(zhí)行命令
go fmt -x testmod
gofmt 命令
usage: gofmt [flags] [path ...]
用法: gofmt [參數(shù)] [路徑 ...]
可選參數(shù):
-cpuprofile string 將cpu配置文件寫入此文件
-d 顯示格式化前后差異,但不寫入文件
-e 打印所有錯誤, 默認只會打印不同行的前10個錯誤
-l 列出需要格式化的文件
-r string 重新規(guī)則,方便我們做批量替換,例如我們需要把hellomod.Hello替換成hellomod.HelloNew("hellomod.Hello -> hellomod.HelloNew")
-s 簡化代碼
-w 將結果直接寫入到文件中
示例:
# 格式當前目錄代碼
gofmt -w ./
# 把當前目錄中的“hellomod.Hello” 替換成 "hellomod.HelloNew"
gofmt -r "hellomod.Hello -> hellomod.HelloNew" -w ./
8. get 下載并安裝包和依賴(下載包和依賴,并對它們進行編譯安裝)
get 命令 下載并安裝包和依賴(下載包和依賴,并對它們進行編譯安裝)
usage: go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages]
用法: go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [包]
可選參數(shù):
-d 只下載不安裝(只執(zhí)行下載動作, 不執(zhí)行安裝動作)
-f 只有在包含了-u參數(shù)的時候才有效.該參數(shù)會讓命令程序忽略掉對已下載代碼包的導入路徑的檢查.如果下載并安裝的代碼包所屬的項目是你從別人那里Fork過來的,那么這樣做就尤為重要了
-fix 會下載代碼包后先執(zhí)行修正動作,而后再進行編譯和安裝
-insecure 請謹慎使用, 允許使用不安全(http或者自定義域)的存儲庫中下載解析.
即:允許命令程序使用非安全的scheme(如HTTP)去下載指定的代碼包.如果你用的代碼倉庫(如公司內(nèi)部的Gitlab)沒有HTTPS支持,可以添加此標記.請在確定安全的情況下使用它.
-t 同時也下載需要為運行測試所需要的包
-u 強制從網(wǎng)絡更新包和它的依賴包.默認情況下,該命令只會從網(wǎng)絡上下載本地不存在的代碼包,而不會更新已有的代碼包
-v 顯示執(zhí)行的命令
示例:
# 下載包
go get github.com/donvito/hellomod
9. install 編譯并安裝指定包及它們的依賴包,
install 編譯并安裝指定包及它們的依賴包,先生成中間文件(可執(zhí)行文件或者.a包),然后把編譯好的結果移到$GOPATH/pkg或者$GOPATH/bin
usage: go install [-i] [build flags] [packages]
用法: go install [-i] [編譯 flags] [包]
可選參數(shù):
-i
示例:
# 安裝包
go install github.com/gin-gonic/gin
10. list 列出包和模塊信息
list 列出包和模塊信息
usage: go list [-f format] [-json] [-m] [list flags] [build flags] [packages]
用法: go list [-f format] [-json] [-m] [list flags] [build flags] [包]
可選參數(shù):
-f {{.字段名}} 查看指定的字段信息
-json 以json格式打印信息
-m 列出模塊信息
更多用法請參考(go help list)
示例:
# 以json格式打印gapp包信息
go list -json gapp
# 打印模塊信息
go list -m testmod
# 以json格式打印模塊信息
go list -m -json testmod
# testmod模塊打印結果:
{
"Path": "testmod",
"Main": true,
"Dir": "/Users/zhaoweijie/go/src/business-card/docker-compose/go-tutorials/9/examples/testmod",
"GoMod": "/Users/zhaoweijie/go/src/business-card/docker-compose/go-tutorials/9/examples/testmod/go.mod"
}
11. mod 管理模塊
mod 管理模塊
Usage: go mod <command> [arguments]
用法: go mod <命令> [參數(shù)]
可選命令<command>: go help mod <command>
download 下載模塊到本地緩存
usage: go mod download [-json] [modules]
用法:
可選參數(shù):
-json
示例:
# 下載模塊,以json格式打印模塊信息
go mod download -json github.com/qq1060656096/hellomod
# json格式打印 github.com/qq1060656096/hellomod 模塊信息
{
"Path": "github.com/qq1060656096/hellomod",
"Version": "v1.0.0",
"Info": "/Users/zhaoweijie/go/pkg/mod/cache/download/github.com/qq1060656096/hellomod/@v/v1.0.0.info",
"GoMod": "/Users/zhaoweijie/go/pkg/mod/cache/download/github.com/qq1060656096/hellomod/@v/v1.0.0.mod",
"Zip": "/Users/zhaoweijie/go/pkg/mod/cache/download/github.com/qq1060656096/hellomod/@v/v1.0.0.zip",
"Dir": "/Users/zhaoweijie/go/pkg/mod/github.com/qq1060656096/hellomod@v1.0.0",
"Sum": "h1:O66u/mTlM4cHHdwuKPNpUBmJor2XOv0Wa0j+qfOwAN4=",
"GoModSum": "h1:TOAQUVNcJP1uykhVNbIcfTsdYdjs2zrIYEtpAGWpcqg="
}
edit 提供命令來編輯go.mod文件, 主要用于工具或腳本
usage: go mod edit [editing flags] [go.mod]
用法: go mod edit [editing flags] [go.mod]
可選參數(shù):
-fmt 只會格式化go.mod文件
-module 更改模塊路徑
-require=path@version 添加模塊依賴
示例:
# 添加hellomod模塊v1.0.0版本
go mod edit -require=github.com/qq1060656096/hellomod@v1.0.0
-droprequire=path 刪除模塊依賴
示例:
# 刪除hellomod模塊
go mod edit -droprequire=github.com/qq1060656096/hellomod
-exclude=path@version 排查模塊
# 排除hellomod模塊v1.0.0版本
go mod edit -exclude=github.com/qq1060656096/hellomod@v1.0.0
-dropexclude=path@version 刪除排除的模塊(恢復排除的模塊)
# 恢復排除hellomod模塊v1.0.0版本
go mod edit -dropexclude=github.com/qq1060656096/hellomod@v1.0.0
-replace=old[@v]=new[@v] 替換模塊
示例:
# hellomod模塊v1.0.0版本替換成v2.0.0版本
go mod edit -replace=github.com/qq1060656096/hellomod@v1.0.0=github.com/qq1060656096/hellomod@v2.0.0
-dropreplace=old[@v]
-print 打印結果,不會操作go.mod文件
-json 以json格式打印結果,不會操作go.mod文件
graph 打印模塊需求圖
usage: go mod graph
用法: go mod graph
init 在當前?件夾下初始化?個新的模塊(創(chuàng)建go.mod?件)
usage: go mod init [module]
用法: go mod init [模塊名]
示例:
# 創(chuàng)建“github.com/qq1060656096/hellomod”模塊
go mod init github.com/qq1060656096/hellomod
tidy 整理模塊(增加缺少的模塊,刪除未?的模塊)
usage: go mod tidy [-v]
用法: go mod tidy [-v]
可選參數(shù):
-v 打印已經(jīng)刪除的模塊信息
示例:
# 整理模塊,并打印已經(jīng)刪除的模塊
go mod tidy -v
vendor 將依賴復制到vendor下
usage: go mod vendor [-v]
用法: go mod vendor [-v]
可選參數(shù):
-v 打印復制到vendor的所有包和模塊
示例:
# 打印復制到vendor的所有包和模塊
go mod vendor -v
verify 校驗依賴的HASH碼,驗證檢查當前模塊的依賴, 如果依賴本有更改就使用之前的, 如果所有模塊都沒有更改,就打印"all modules verified
", 否則就報告(打印)已更改的模塊
usage: go mod verify
用法: go mod verify
示例:
go mod verify
why 解釋為什么需要依賴
usage: go mod why [-m] [-vendor] packages...
用法: go mod why [-m] [-vendor] packages...
可選參數(shù)
-vendor
-m
12. run 編譯并運行Go程序
run 命令 編譯并運行Go程序
usage: go run [build flags] [-exec xprog] package [arguments...]
用法: go run [編譯 flags] [-exec xprog] 包 [arguments...]
可選參數(shù): 其他參數(shù)請參考(go help build)
-exec
示例:
# 運行maing.go
go run main.go
# 運行maing.go并開啟競態(tài)檢測(開發(fā)時建議開啟這個選項)
go run -race main.go
13. test 測試包
go test 用于測試包
usage: go test [build/test flags] [packages] [build/test flags & test binary flags]
-c 把包編譯二進制測試包, 注意不會運行, 需要你手動執(zhí)行二進制測試
示例:
go test -c package_import_path
go test -c 包的導入路徑
1. go test -c 在當前目錄生成二進制測試
2. go test -c go test -c go-tutorials/8/examples/demo1
-exec 運行二進制測試
示例:
go test -c -exec demo1.test
-json 運行測試,并將結果輸出為json格式
示例:
go test -json path
1. go test -json 測試當前包
2. go test -json ./
-o 把測試編譯成自己命名二進制包, 默認仍然會運行測試(除非指定-c或者-i)
示例:
go test -o file_name
go test -o 文件名
1. go test -o demo1.custom_name.test
-bench 運行基準測試, 默認情況下不運行
示例:
go test -bench regexp
go test -bench 正則表達式
1. go test -bench 運行所有基準測試
2. go test -bench=. 運行所有基準測試
3. go test -bench=hah 運行指定的基準測試
-benchtime 基準測試,持續(xù)時間(默認1秒)
-count 運行測試次數(shù)
示例:
go test -count n
go test -count 次數(shù)
1. go test -count 10 運行所有的測試10次
-cover 覆蓋率統(tǒng)計, 注意覆蓋率統(tǒng)計是通過代碼注釋來工作的
-cpu 指定測試cpu數(shù)量
示例:
go test -cpu 1,2,4
go test -cpu cpu數(shù)量
1. go test -cpu 8 指定8個cpu
-list regexp 列出匹配的測試
示例:
go test -list regexp
go test -list 正則表達式
1. go test -list Login 列出demo1中的測試
-v 詳細輸出運行時記錄所有的測試
示例:
go test -v
14. tool 運行指定的go工具
tool 命令 運行指定的go工具
usage: go tool [-n] command [args...]
用法: go tool [-n] 命令 [args...]
可選參數(shù):
-n 打印要執(zhí)行的命令, 但是不真正的執(zhí)行
示例:
# 打印vet工具執(zhí)行的命令
go tool -n vet
** go tool 工具列表 **
# go tool: 列表工具列表
# go tool 工具 -h: 查看工具幫助文檔
# 查看vet工具幫助文檔: go tool vet -h
addr2line
api
asm
buildid
cgo
compile
cover
dist
doc
fix
link
nm
objdump
pack
pprof 可以幫助開發(fā)者快速分析及定位各種性能問題,如 CPU 消耗吗跋、內(nèi)存分配及阻塞分析
test2json
trace
vet 報告包中可能出現(xiàn)的錯誤,開發(fā)時建議使用這個工具(fmt printf函數(shù)參數(shù)不對或者聲明結構體 tag聲明不對等)
15. version 查看當前go語言版本
version 查看go當前的版本
usage: go version
示例:
# 查看go當前的版本
go version
16. vet 報告包中可能出現(xiàn)的錯誤
vet 靜態(tài)檢查工具,報告包中可能出現(xiàn)的錯誤, 開發(fā)時建議使用這個工具(fmt printf函數(shù)參數(shù)不對或者聲明結構體 tag聲明不對等)
usage: go vet [-n] [-x] [build flags] [vet flags] [packages]
用法: go vet [-n] [-x] [編譯參數(shù)] [vet flags] [包]
可選參數(shù):
-n 打印要執(zhí)行的命令, 但是不真正的執(zhí)行
-x 打印執(zhí)行的命令
更多參數(shù)請參考(go help build)
示例:
# 檢測 testmod 包中可能存在的問題
go vet testmod