golang 命令詳解

golang 命令詳解

github地址


1. build 編譯包和依賴項

2. clean 刪除對象文件和緩存的文件

3. doc與godoc 顯示包文檔

4. env 打印Go語言的環境信息

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 報告包中可能出現的錯誤

1. build 編譯包和依賴項


build 編譯包和依賴項

usage: go build [-o output] [-i] [build flags] [packages]

用法:  go build [-o output] [-i] [build 參數] [包]

可選參數:

    -o 編譯單個包才能使用(不能同時對多個代碼包進行編譯),例如我們經常重新命名可執行文件名字

    -i 標志安裝的包是目標的依賴項

    -a 強制重新構建已經更新的包

    -n 打印編譯時執行的命令,但不真正執行

    -p 開啟并發編譯,默認情況下該值為CPU邏輯核數

    -race 開啟競態檢測,只支持linux/amd64、freebsd/amd64、darwin/amd64和windows/amd64.

    -msan 內存掃描

    -v 編譯包時打印包的名稱

    -work 編譯時打印臨時工作目錄的名稱,退出時不刪除它

    -x 打印編譯時執行的命令(打印編譯時會用到的所有命令)

    -asmflags '[pattern=]arg list',傳遞給每個go工具asm調用的參數

    -buildmode mode 使用編譯模式, 更多信息請參見“go help buildmode”

    -compiler name 設置編譯時使用編譯器名,編譯器名稱只有2個選項(gccgo或gc)

    -gccgoflags '[pattern=]arg list' 傳遞每個gccgo編譯器/鏈接器調用的參數列表

    -gcflags '[pattern=]arg list' 用于指定需要傳遞給go tool compile命令的參數的列表,更多信息參見(go tool compile)

    -installsuffix suffix 為了使當前的輸出目錄與默認的編譯輸出目錄分離,可以使用這個標記.此標記的值會作為結果文件的父目錄名稱的后綴.其實,如果使用了-race標記,這個標記會被自動追加且其值會為race.如果我們同時使用了-race標記和-installsuffix,那么在-installsuffix標記的值的后面會再被追加_race,并以此來作為實際使用的后綴

    -ldflags '[pattern=]arg list' 用于指定需要傳遞給go tool link命令的參數的列表

    -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編譯成可執行文件hello.exe

go build -o hello.exe  main.go

# 打印編譯時執行的命令,但不真正執行

go build -n

# 答應工作目錄

go build -work

2. clean 刪除對象文件和緩存的文件


clean 刪除執行其他命令時產生的文件、目錄和緩存文件.

    具體地說.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 參數]  [build參數]  包

  可選參數:

    -i 會刪除安裝當前代碼包所有產生的所有文件, 如果當前包是一個普通包(不是main包),則結果文件指的就是在工作區的pkg目錄的相應目錄下的歸檔文件.如果當前代碼包中只包含一個命令源碼文件, 則刪除當前目錄和在工作區的bin目錄下的可執行文件和測試文件.

    -n 打印clean執行的命令,但不真正執行

    -r 刪除當前代碼包和所有的依賴包產生的文件、目錄和緩存文件

    -x 打印clean執行的刪除命令

    -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]]

可選參數:

    -c 區分參數包名的大小寫.默認情況下,包名是大小寫不敏感的

    -cmd 打印 main 包文檔, 默認情況下不會打印 main 包文檔

    -u 打印出所有的文檔(同事包含可導出和不可導出實體)

示例:

# 顯示 hellomod 包文檔,(注意 hellomod 和 Hellomod是不同的包)

go doc -c hellomod

4. env 打印Go語言的環境信息


env 打印Go語言的環境信息

usage: go env [-json] [var ...]

用法: go env [-json] [變量 ...]

可選參數:

    -json 以json格式打印環境信息

示例:

# 以json格式打印所有環境信息

go env -json

# 以json格式只打印 GOOS 程序構建環境的目標操作系統

go env -json GOOS

# 打印所有環境信息

go env

# 只打印 GOOS 程序構建環境的目標操作系統

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 不將修正后的內容寫入文件, 而只打印修正前后的內容的對比信息到標準輸出

    -force string 使用此參數后, 即使源碼文件中的代碼已經與Go語言的最新版本相匹配, 也會強行執行指定的修正操作.該參數值就是需要強行執行的修正操作的名稱,多個名稱之間用英文半角逗號分隔

    -r string 只對目標源碼文件做有限的修正操作.該參數的值即為允許的修正操作的名稱.多個名稱之間用英文半角逗號分隔

6. fmt與gofmt 格式化go源文件

Go 開發團隊不想要 Go 語言像許多其它語言那樣總是在為代碼風格而引發無休止的爭論,浪費大量寶貴的開發時間,因此他們制作了一個工具:go fmt(gofmt)


fmt與gofmt 命令 格式化go源文件,fmt命令實際"gofmt -l -w"命令之上做了一層包裝,我們一般使用

usage: go fmt [-n] [-x] [packages]

用法: go fmt [-n] [-x] 包

可選參數:

    -x 打印執行的命令

    -n 打印執行的命令,但不真正執行

示例:

# 格式化 testmod 包, 并顯示執行命令

go fmt -x testmod

gofmt 命令

usage: gofmt [flags] [path ...]

用法: gofmt [參數] [路徑 ...]

可選參數:

    -cpuprofile string 將cpu配置文件寫入此文件

    -d 顯示格式化前后差異,但不寫入文件

    -e 打印所有錯誤, 默認只會打印不同行的前10個錯誤

    -l 列出需要格式化的文件

    -r string 重新規則,方便我們做批量替換,例如我們需要把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] [包]

可選參數:

    -d 只下載不安裝(只執行下載動作, 不執行安裝動作)

    -f 只有在包含了-u參數的時候才有效.該參數會讓命令程序忽略掉對已下載代碼包的導入路徑的檢查.如果下載并安裝的代碼包所屬的項目是你從別人那里Fork過來的,那么這樣做就尤為重要了

    -fix 會下載代碼包后先執行修正動作,而后再進行編譯和安裝

    -insecure 請謹慎使用, 允許使用不安全(http或者自定義域)的存儲庫中下載解析.

        即:允許命令程序使用非安全的scheme(如HTTP)去下載指定的代碼包.如果你用的代碼倉庫(如公司內部的Gitlab)沒有HTTPS支持,可以添加此標記.請在確定安全的情況下使用它.

    -t 同時也下載需要為運行測試所需要的包

    -u 強制從網絡更新包和它的依賴包.默認情況下,該命令只會從網絡上下載本地不存在的代碼包,而不會更新已有的代碼包

    -v 顯示執行的命令

示例:

# 下載包

go get github.com/donvito/hellomod

9. install 編譯并安裝指定包及它們的依賴包,


install 編譯并安裝指定包及它們的依賴包,先生成中間文件(可執行文件或者.a包),然后把編譯好的結果移到$GOPATH/pkg或者$GOPATH/bin

usage: go install [-i] [build flags] [packages]

用法: go install [-i] [編譯 flags] [包]

可選參數:

    -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] [包]

可選參數:

    -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 <命令> [參數]

可選命令<command>: go help mod <command>

    download    下載模塊到本地緩存

        usage: go mod download [-json] [modules]

          用法:

        可選參數:

            -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]

        可選參數:

            -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    在當前?件夾下初始化?個新的模塊(創建go.mod?件)

        usage: go mod init [module]

        用法: go mod init [模塊名]

        示例:

            # 創建“github.com/qq1060656096/hellomod”模塊

            go mod init github.com/qq1060656096/hellomod

    tidy    整理模塊(增加缺少的模塊,刪除未?的模塊)

        usage: go mod tidy [-v]

        用法: go mod tidy [-v]

        可選參數:

            -v 打印已經刪除的模塊信息

        示例:

            # 整理模塊,并打印已經刪除的模塊

            go mod tidy -v

    vendor  將依賴復制到vendor下

        usage: go mod vendor [-v]

        用法: go mod vendor [-v]

        可選參數:

            -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...

        可選參數

            -vendor

            -m

12. run 編譯并運行Go程序


run 命令 編譯并運行Go程序

usage: go run [build flags] [-exec xprog] package [arguments...]

用法: go run [編譯 flags] [-exec xprog] 包 [arguments...]

可選參數: 其他參數請參考(go help build)

    -exec

示例:

# 運行maing.go

go run main.go

# 運行maing.go并開啟競態檢測(開發時建議開啟這個選項)

go run -race main.go

13. test 測試包


go test 用于測試包

usage: go test [build/test flags] [packages] [build/test flags & test binary flags]

    -c 把包編譯二進制測試包, 注意不會運行, 需要你手動執行二進制測試

        示例:

            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 基準測試,持續時間(默認1秒)



    -count 運行測試次數

        示例:

            go test -count n

            go test -count 次數

            1. go test -count 10 運行所有的測試10次

    -cover 覆蓋率統計, 注意覆蓋率統計是通過代碼注釋來工作的

    -cpu 指定測試cpu數量

        示例:

            go test -cpu 1,2,4

            go test -cpu cpu數量

            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...]

可選參數:

    -n 打印要執行的命令, 但是不真正的執行

示例:

# 打印vet工具執行的命令

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 可以幫助開發者快速分析及定位各種性能問題,如 CPU 消耗、內存分配及阻塞分析

test2json

trace

vet 報告包中可能出現的錯誤,開發時建議使用這個工具(fmt printf函數參數不對或者聲明結構體 tag聲明不對等)

15. version 查看當前go語言版本


version 查看go當前的版本

usage: go version

示例:

# 查看go當前的版本

go version

16. vet 報告包中可能出現的錯誤


vet 靜態檢查工具,報告包中可能出現的錯誤, 開發時建議使用這個工具(fmt printf函數參數不對或者聲明結構體 tag聲明不對等)

usage: go vet [-n] [-x] [build flags] [vet flags] [packages]

用法: go vet [-n] [-x] [編譯參數] [vet flags] [包]

可選參數:

    -n 打印要執行的命令, 但是不真正的執行

    -x 打印執行的命令

更多參數請參考(go help build)

示例:

# 檢測 testmod 包中可能存在的問題

go vet testmod

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

推薦閱讀更多精彩內容

  • 本文簡單介紹 Golang 提供的命令。我們執行 go help [command] 可以查看具體命令的幫助信息。...
    juniway閱讀 2,018評論 0 2
  • go build 這個命令主要用于編譯代碼。在包的編譯過程中,若有必要,會同時編譯與之相關聯的包。 如果是普通包,...
    今早上閱讀 633評論 0 3
  • 主要來源:《Go Web編程》 1、go build 作用:compile packages and depend...
    molscar閱讀 371評論 0 0
  • 簡介 用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者...
    保川閱讀 5,981評論 1 13
  • 2017年8月2日 1.感恩爸媽的養育之恩幫助照顧孩子。 2.感恩兒子讓我享受到幸福,昨天送只哭了兩聲今天哭得撕心...
    馮梓源閱讀 199評論 0 0