Go 学习笔记(37)— 标准命令(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get)
1. 標準命令簡述
Go 本身包含來大量用于處理 Go 程序的命令和工具。
| 命令 | 作用 |
|---|---|
| build | 用于編譯指定的代碼包或 Go 語言源碼文件。命令源碼文件會被編譯成可執行文件,并存放到命令執行的目錄或指定目錄下。而庫源碼文件被編譯后,則不會在非臨時目錄中留下任何文件。 |
| clean | 用于清除因執行其他 go 命令而遺留下來的臨時目錄和文件。 |
| doc | 用于顯示打印 Go 語言代碼包以及程序實體的文檔。 |
| env | 用于打印 Go 語言相關的環境信息。 |
| fix | 用于修正指定代碼的源碼文件中包含的過時語法和代碼調用。這使得我們在升級 Go 語言版本時,可以非常方便地同步升級程序 |
| fmt | 用于格式化指定代碼包中的 Go 源碼文件。實際上,它是通過執行 gofmt 命令來實現功能的。 |
| generate | 用于識別指定代碼中資源文件中的 “go:generate” 注釋,并執行其攜帶的任意命令。該命令獨立于 Go 語言標準的編譯和安裝體系。如果你有需要解析的 “go:generate” 注釋,就單獨運行它。這個命令非常有用,我常用它自動生成或改動 Go 源碼文件 |
| get | 用于下載,編譯并安裝指定改動代碼包及其依賴包。從我們自己的代碼中轉站或第三方代碼庫上自動拉取代碼,就全靠它了。 |
| install | 用于編譯并安裝指定的代碼包及其依賴包。安裝命令源碼文件后,代碼包所在的工作區目錄的 bin 子目錄,或者當前環境變量 GOBIN 指向的目錄中會生成相應的可執行文件。安裝庫源碼文件后,會在代碼包所在的工作目錄的 pkg 子目錄中生成相應的歸檔文件。 |
| list | 用于顯示指定代碼包的信息,它可謂是代碼包分析的一大便利工具。利用 Go 語言標準代碼庫代碼包 “text/template” 中規定的模版語法,你可以非常靈活的控制輸出信息。 |
| run | 用于編譯并運行指定的代碼源碼文件。當你想不生成可執行文件而直接運行命令源碼文件時,就需要用到它。 |
| test | 用于測試指定的代碼包,前提是該代碼包目錄中必須存在測試源代碼文件。 |
| tool | 用于運行 Go 語言的特殊工具。 |
| vet | 用于檢查指定代碼包中的 Go 語言代碼,并報告發現可疑代碼問題。該命令提供了除編譯之外的又一個程序檢查方法,可用于找到程序中的潛在錯誤。 |
| version | 用于顯示當前安裝的 Go 語言的版本信息以及計算環境。 |
2. 標準命令使用
2.1 go build
Go 語言中使用 go build 命令主要用于編譯代碼。在包的編譯過程中,若有必要,會同時編譯與之相關聯的包。
go build 有很多種編譯方法,如無參數編譯、文件列表編譯、指定包編譯等,使用這些方法都可以輸出可執行文件。
在進行 go build 時可以使用 export 命令指定當前 GOPATH 路徑。
export GOPATH=/home/wohu/gocode
go build -o main main.go
./main
2.1.1 無參數編譯
代碼相對于 GOPATH 如下:
wohu@wohu:~/gocode/src$ tree -L 2
└── main├── main.go└── upload.go
upload.go 代碼內容:
package mainimport "fmt"func upload() {fmt.Println("This is upload function ")
}
main.go 代碼內容:
package mainfunc main() {upload()
}
wohu@wohu:~/gocode/src$
wohu@wohu:~/gocode/src$ cd main/
wohu@wohu:~/gocode/src/main$ go build
wohu@wohu:~/gocode/src/main$ ls
main main.go upload.go
wohu@wohu:~/gocode/src/main$ ./main # 執行 main 后的輸出內容
This is upload function
go build 在編譯開始時,會搜索當前目錄的 go 源碼。這個例子中, go build 會找到 upload.go 和 main.go 兩個文件。編譯這兩個文件后,生成當前目錄名的可執行文件并放置于當前目錄下,這里的可執行文件是 main 。
2.1.2 go build + 文件列表
編譯同目錄的多個源碼文件時,可以在 go build 的后面提供多個文件名, go build 會編譯這些源碼,輸出可執行文件,“go build+文件列表”的格式如下:
go build file1.go file2.go……
注意:使用“go build+文件列表”方式編譯時,可執行文件默認選擇文件列表中第一個源碼文件作為可執行文件名輸出。
wohu@wohu:~/gocode/src/main$ go build upload.go main.go
wohu@wohu:~/gocode/src/main$ ls
main.go upload upload.go
wohu@wohu:~/gocode/src/main$ ./upload
This is upload function
wohu@wohu:~/gocode/src/main$
wohu@wohu:~/gocode/src/main$ ls
main.go upload.go
wohu@wohu:~/gocode/src/main$ go build main.go upload.go
wohu@wohu:~/gocode/src/main$ ls
main main.go upload.go
wohu@wohu:~/gocode/src/main$ ./main
This is upload function
如果需要指定輸出可執行文件名,可以使用-o參數,參見下面的例子:
wohu@wohu:~/gocode/src/main$ ls
main.go upload.go
wohu@wohu:~/gocode/src/main$ go build -o test main.go upload.go
wohu@wohu:~/gocode/src/main$ ls
main.go test upload.go
wohu@wohu:~/gocode/src/main$ ./test
This is upload function
wohu@wohu:~/gocode/src/main$
使用“go build+文件列表”編譯方式編譯時,文件列表中的每個文件必須是同一個包的 Go 源碼。
“go build+文件列表”方式更適合使用 Go 語言編寫的只有少量文件的工具。
2.1.3 go build + 包
“go build+包”在設置 GOPATH 后,可以直接根據包名進行編譯,即便包內文件被增(加)刪(除)也不影響編譯指令。
代碼格式如下:
wohu@wohu:~/gocode/src$ tree -L 3
└── mypackage├── main.go└── upload└── upload.go
main.go 代碼:
package mainimport "mypackage/upload"func main() {upload.Demo()
}
upload.go 代碼:
package uploadimport "fmt"func Demo() {fmt.Println("This is upload function ")
}
編譯命令:
wohu@wohu:~/gocode/src$ export GOPATH=/home/wohu/gocode
wohu@wohu:~/gocode/src$ go build -o main mypackage/
wohu@wohu:~/gocode/src$ ls
github.com golang.org main mypackage
wohu@wohu:~/gocode/src$ ./main
This is upload function
wohu@wohu:~/gocode/src$
設置環境變量 GOPATH 為自己的目錄,注意 GOPATH 下的目錄結構,源碼必須放在 GOPATH 下的 src 目錄下。所有目錄中不要包含中文。
每個包可以由它們的導入路徑指定,就像前面看到的那樣,或者用一個相對目錄的路徑名指定,相對路徑必須以.或..開頭。如果沒有指定參數,那么默認指定為當前目錄對應的包。下面的命令用于構建同一個包,雖然它們的寫法各不相同:
$ cd $GOPATH/src/gopl.io/ch1/helloworld
$ go build
或者:
$ cd anywhere
$ go build gopl.io/ch1/helloworld
或者:
$ cd $GOPATH
$ go build ./src/gopl.io/ch1/helloworld
但不能這樣:
$ cd $GOPATH
$ go build src/gopl.io/ch1/helloworld
Error: cannot find package "src/gopl.io/ch1/helloworld".
-o執行指定輸出文件為 main ,后面接要編譯的包名。包名是相對于 GOPATH 下的 src 目錄開始的。
go build 還有一些附加參數,可以顯示更多的編譯信息和更多的操作,詳見下表所示。
| 附加參數 | 備 注 |
|---|---|
-v | 編譯時顯示包名 |
-p n | 開啟并發編譯,默認情況下該值為 CPU 邏輯核數 |
-a | 強制重新構建 |
-n | 打印編譯時會用到的所有命令,但不真正執行 |
-x | 打印編譯時會用到的所有命令 |
-race | 開啟競態檢測,常用于并發模式下的共享變量檢測 |
-o | 后接文件名,強制對輸出的文件進行重命名 |
-work | 打印編譯工作的臨時目錄 |
-gcflags | 后面的參數可以是多個,用空格進行分隔,并用 ""進行包裹,這些參數將傳遞到 go tool compile 工具中進行調用。例如,go build -gcflags "-l -m" |
-ldflags | 后面的參數可以是多個,用空格進行分隔,并用 ""進行包裹,這些參數將傳遞到 go tool link 工具中進行調用。例如,go build -ldflags "-w -s"。這個命令可以隱藏所有代碼實現相關的信息,并減少生成文件的大小。其中,-w 可以移除調試信息(無法使用gdb 調試),-s 可以移除符號表 |
在運行 go build 命令的時候,默認不會編譯目標代碼包所依賴的那些代碼包。當然,如果被依賴的代碼包的歸檔文件不存在,或者源碼文件有了變化,那它還是會被編譯。
如果要強制編譯它們,可以在執行命令的時候加入標記 -a 。此時,不但目標代碼包總是會被編譯,它依賴的代碼包也總會被編譯,即使依賴的是標準庫中的代碼包也是如此。
如果不但要編譯依賴的代碼包,還要安裝它們的歸檔文件,那么可以加入標記 -i 。那么我們怎么確定哪些代碼包被編譯了呢?有兩種方法。
- 運行
go build命令時加入標記-x,這樣可以看到go build命令具體都執行了哪些操作; - 也可以加入標記
-n,這樣可以只查看具體操作而不執行它們。運行go build命令時加入標記-v,這樣可以看到go build命令編譯的代碼包的名稱。它在與-a標記搭配使用時很有用;
2.1.4 跨平臺編譯
什么是跨平臺編譯呢?就是你在 macOS 開發,可以編譯 Linux、Windows 等平臺上的可執行程序,這樣你開發的程序,就可以在這些平臺上運行。也就是說,你可以選擇喜歡的操作系統做開發,并跨平臺編譯成需要發布平臺的可執行程序即可。
使用示例:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
參數說明
CGO_ENABLED:CGO表示golang中的工具,CGO_ENABLED=0表示CGO禁用,交叉編譯中不能使用CGO;GOOS: 環境變量用于指定目標操作系統,mac對應darwin,linux對應linux,windows對應windows,還有其它的freebsd、android等;GOARCH:環境變量用于指定處理器的類型,386 也稱x86對應 32位操作系統、amd64也稱 x64 對應 64 位操作系統,arm這種架構一般用于嵌入式開發。比如Android,iOS,Win mobile等;
針對不同操作系統或 CPU 的交叉編譯(交叉構建)也是很簡單的。只需要設置好目標對應的 GOOS 和 GOARCH ,然后運行構建命令即可。
通過組合不同的 GOOS 和 GOARCH,就可以編譯出不同的可執行程序。比如在 macOS AMD64 系統想編譯出 Linux AMD64 的可執行程序,只需要執行如下代碼:
$ GOOS=linux GOARCH=amd64 go build ./main.go
nvidia@tegra-ubuntu:~$ uname -a
Linux tegra-ubuntu 4.4.38-tegra #1 SMP PREEMPT Fri Jul 28 09:55:22 PDT 2017 aarch64 aarch64 aarch64 GNU/Linux
root@orangepizerolts:/tmp# uname -a
Linux orangepizerolts 5.4.27-sunxi #2.0.8 SMP Tue Jun 9 18:36:35 CST 2020 armv7l armv7l armv7l GNU/Linux
aarch64 和 armv7l 都是 arm 架構
GOOS=linux GOARCH=arm go build ./main.go
Golang 支持在一個平臺下生成另一個平臺可執行程序的交叉編譯功能。交叉編譯不支持 CGO,所以設置 CGO_ENABLED=0 。
Mac下編譯Linux,Windows平臺的 64 位可執行程序:
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Linux下編譯Mac,Windows平臺的 64 位可執行程序:
$ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Windows下編譯Mac,Linux平臺的 64 位可執行程序:
$ SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
$ SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go
2.2 go clean
Go 語言中go clean命令可以移除當前源碼包和關聯源碼包里面編譯生成的文件,這些文件包括以下幾種:
-
執行
go build命令時在當前目錄下生成的與包名或者 Go 源碼文件同名的可執行文件。 -
執行
go test命令并加入-c標記時在當前目錄下生成的以包名加“.test”后綴為名的文件。 -
執行
go install命令安裝當前代碼包時產生的結果文件。如果當前代碼包中只包含庫源碼文件,則結果文件指的就是在工作區 pkg 目錄下相應的歸檔文件。如果當前代碼包中只包含一個命令源碼文件,則結果文件指的就是在工作區 bin 目錄下的可執行文件。 -
在編譯 Go 或 C 源碼文件時遺留在相應目錄中的文件或目錄 。包括:“_obj”和“_test”目錄,名稱為“_testmain.go”、“test.out”、“build.out”或“a.out”的文件,名稱以“.5”、“.6”、“.8”、“.a”、“.o”或“.so”為后綴的文件。這些目錄和文件是在執行
go build命令時生成在臨時目錄中的。
go clean 命令對應的參數的含義如下所示:
-i清除關聯的安裝的包和可運行文件,也就是通過go install安裝的文件;-n把需要執行的清除命令打印出來,但是不執行,這樣就可以很容易的知道底層是如何運行的;-r循環的清除在 import 中引入的包;-x打印出來執行的詳細命令,其實就是 -n 打印的執行版本;-cache刪除所有go build命令的緩存-testcache刪除當前包所有的測試結果
使用演示:
wohu@wohu:~/gocode/src/mypackage$ go build -race -v -o main ../mypackage/
wohu@wohu:~/gocode/src/mypackage$ go clean -n
cd /home/wohu/gocode/src/mypackage
rm -f mypackage mypackage.exe mypackage.test mypackage.test.exe main main.exe
wohu@wohu:~/gocode/src/mypackage$ ls
main main.go upload
wohu@wohu:~/gocode/src/mypackage$ go clean -x
cd /home/wohu/gocode/src/mypackage
rm -f mypackage mypackage.exe mypackage.test mypackage.test.exe main main.exe
wohu@wohu:~/gocode/src/mypackage$ ls
main.go upload
wohu@wohu:~/gocode/src/mypackage$
2.3 go run
go run 命令會編譯源碼,并且直接執行源碼的 main() 函數,不會在當前目錄留下可執行文件。
wohu@wohu:~/gocode/src/mypackage$ ls
main.go upload
wohu@wohu:~/gocode/src/mypackage$ go run main.go
This is upload function
go run 不會在運行目錄下生成任何文件,可執行文件被放在臨時文件中被執行,工作目錄被設置為當前目錄。
在 go run 的后部可以添加參數,這部分參數會作為代碼可以接受的命令行輸入提供給程序。
go run 不能使用“go run+包”的方式進行編譯,如需快速編譯運行包,需要使用如下步驟來代替:
- 使用
go build生成可執行文件; - 運行可執行文件;
2.4 go fmt
Go 語言的開發團隊制定了統一的官方代碼風格,并且推出了 gofmt 工具( gofmt 或 go fmt )來幫助開發者格式化他們的代碼到統一的風格。
gofmt 是一個 cli 程序,會優先讀取標準輸入,如果傳入了文件路徑的話,會格式化這個文件,如果傳入一個目錄,會格式化目錄中所有 .go 文件,如果不傳參數,會格式化當前目錄下的所有 .go 文件。
gofmt 命令參數如下表所示:
| 標記名稱 | 標記描述 |
|---|---|
| -l | 僅把那些不符合格式化規范的、需要被命令程序改寫的源碼文件的絕對路徑打印到標準輸出。而不是把改寫后的全部內容都打印到標準輸出。 |
| -w | 把改寫后的內容直接寫入到文件中,而不是作為結果打印到標準輸出。 |
| -r | 添加形如“a[b:len(a)] -> a[b:]”的重寫規則。如果我們需要自定義某些額外的格式化規則,就需要用到它。 |
| -s | 簡化文件中的代碼。 |
| -d | 只把改寫前后內容的對比信息作為結果打印到標準輸出。而不是把改寫后的全部內容都打印到標準輸出。命令程序將使用 diff 命令對內容進行比對。在 Windows 操作系統下可能沒有 diff 命令,需要另行安裝。 |
| -e | 打印所有的語法錯誤到標準輸出。如果不使用此標記,則只會打印每行的第 1 個錯誤且只打印前 10 個錯誤。 |
| -comments | 是否保留源碼文件中的注釋。在默認情況下,此標記會被隱式的使用,并且值為 true。 |
| -tabwidth | 此標記用于設置代碼中縮進所使用的空格數量,默認值為 8。要使此標記生效,需要使用“-tabs”標記并把值設置為 false。 |
| -tabs | 是否使用 tab(’\t’)來代替空格表示縮進。在默認情況下,此標記會被隱式的使用,并且值為 true。 |
| -cpuprofile | 是否開啟 CPU 使用情況記錄,并將記錄內容保存在此標記值所指的文件中。 |
注意: gofmt 使用 tab 來表示縮進,并且對行寬度無限制,如果手動對代碼進行了換行, gofmt 不會強制把代碼格式化回一行。
go fmt 和 gofmt 區別:
gofmt 是一個獨立的 cli 程序,而 Go 語言中還有一個go fmt命令,go fmt命令是 gofmt 的簡單封裝。
go fmt命令本身只有兩個可選參數-n和-x:
-n僅打印出內部要執行的go fmt的命令;-x命令既打印出go fmt命令又執行它,如果需要更細化的配置,需要直接執行 gofmt 命令。
2.5 go install
go install 命令的功能和 go build 中命令類似,附加參數絕大多數都可以與 go build 通用。 go install 只是將編譯的中間文件放在 GOPATH 的 pkg 目錄下,以及固定地將編譯結果放在 GOPATH 的 bin 目錄下。
這個命令在內部實際上分成了兩步操作:第一步是生成結果文件(可執行文件或者 .a 包),第二步會把編譯好的結果移到 $GOPATH/pkg 或者 $GOPATH/bin 。
go install 的編譯過程有如下規律:
go install是建立在GOPATH上的,無法在獨立的目錄里使用go install。GOPATH下的bin目錄放置的是使用go install生成的可執行文件,可執行文件的名稱來自于編譯時的包名。go install輸出目錄始終為GOPATH下的bin目錄,無法使用-o附加參數進行自定義。GOPATH下的pkg目錄放置的是編譯期間的中間文件。
2.6 go get
go get 命令可以借助代碼管理工具通過遠程拉取或更新代碼包及其依賴包,并自動完成編譯和安裝。整個過程就像安裝一個 App 一樣簡單。
這個命令可以動態獲取遠程代碼包,目前支持的有 BitBucket 、 GitHub 、 Google Code 和 Launchpad 。在使用 go get 命令前,需要安裝與遠程包匹配的代碼管理工具,如 Git 、 SVN 、 HG 等,參數中需要提供一個包名。
這個命令在內部實際上分成了兩步操作:
- 是下載源碼包;
- 是執行
go install;
所以為了 go get 命令能正常工作,你必須確保安裝了合適的源碼管理工具,并同時把這些命令加入你的 PATH 中。其實 go get 支持自定義域名的功能。
默認情況下, go get 可以直接使用。例如,想獲取 go 的源碼并編譯,使用下面的命令行即可:
$ go get github.com/davyxu/cellnet
- go get 使用時的附加參數
| 附加參數 | 備 注 |
|---|---|
-v | 顯示操作流程的日志及信息,方便檢查錯誤 |
-u | 確保所有的包和依賴的包的版本都是最新的,然后重新編譯和安裝它們。如果不包含該標志參數的話,而且如果包已經在本地存在,那么代碼將不會被自動更新。 |
-d | 只下載,不安裝 |
-insecure | 允許使用不安全的 HTTP 方式進行下載操作 |
-t | 同時也下載需要為運行測試所需要的包 |
-fix | 在獲取源碼之后先運行 fix,然后再去做其他的事情 |
2.7 go doc
2.7.1 go doc 命令
該命令打印其后所指定的實體的聲明與文檔注釋,該實體可能是一個包:
$ go doc time
package time // import "time"Package time provides functionality for measuring and displaying time.const Nanosecond Duration = 1 ...
func After(d Duration) <-chan Time
func Sleep(d Duration)
func Since(t Time) Duration
func Now() Time
type Duration int64
type Time struct { ... }
...many more...
或者是某個具體的包成員:
$ go doc time.Since
func Since(t Time) DurationSince returns the time elapsed since t.It is shorthand for time.Now().Sub(t).
或者是一個方法:
$ go doc time.Duration.Seconds
func (d Duration) Seconds() float64Seconds returns the duration as a floating-point number of seconds.
2.7.2 go doc 頁面
它提供可以相互交叉引用的 HTML 頁面,但是包含和 go doc命令相同以及更多的信息。 godoc 的在線服務 https://godoc.org ,包含了成千上萬的開源包的檢索工具。
也可以在自己的工作區目錄運行 godoc 服務。運行下面的命令,然后在瀏覽器查看 http://localhost:8000/pkg 頁面:
$ godoc -http :8000
其中-analysis=type和-analysis=pointer命令行標志參數用于打開文檔和代碼中關于靜態分析的結果。
2.8 go list
go list命令可以查詢可用包的信息。其最簡單的形式,可以測試包是否在工作區并打印它的導入路徑:
$ go list github.com/go-sql-driver/mysql
github.com/go-sql-driver/mysql
go list命令的參數還可以用"..."表示匹配任意的包的導入路徑。我們可以用它來列出工作區中的所有包:
$ go list ...
archive/tar
archive/zip
bufio
bytes
cmd/addr2line
cmd/api
...many more...
或者是特定子目錄下的所有包:
$ go list gopl.io/ch3/...
gopl.io/ch3/basename1
gopl.io/ch3/basename2
gopl.io/ch3/comma
gopl.io/ch3/mandelbrot
gopl.io/ch3/netflag
gopl.io/ch3/printints
gopl.io/ch3/surface
或者是和某個主題相關的所有包:
$ go list ...xml...
encoding/xml
gopl.io/ch7/xmlselect
go list命令還可以獲取每個包完整的元信息,而不僅僅只是導入路徑,這些元信息可以以不同格式提供給用戶。其中 -json命令行參數表示用 JSON 格式打印每個包的元信息。
$ go list -json hash
{"Dir": "/home/gopher/go/src/hash","ImportPath": "hash","Name": "hash","Doc": "Package hash provides interfaces for hash functions.","Target": "/home/gopher/go/pkg/darwin_amd64/hash.a","Goroot": true,"Standard": true,"Root": "/home/gopher/go","GoFiles": ["hash.go"],"Imports": ["io"],"Deps": ["errors","io","runtime","sync","sync/atomic","unsafe"]
}
命令行參數-f則允許用戶使用 text/template 包的模板語言定義輸出文本的格式。下面的命令將打印 strconv 包的依賴的包,然后用 join 模板函數將結果鏈接為一行,連接時每個結果之間用一個空格分隔:
$ go list -f '{{join .Deps " "}}' strconv
errors math runtime unicode/utf8 unsafe
譯注:上面的命令在 Windows 的命令行運行會遇到template: main:1: unclosed action的錯誤。產生這個錯誤的原因是因為命令行對命令中的" "參數進行了轉義處理。可以按照下面的方法解決轉義字符串的問題:
$ go list -f "{{join .Deps \" \"}}" strconv
下面的命令打印 compress 子目錄下所有包的導入包列表:
$ go list -f '{{.ImportPath}} -> {{join .Imports " "}}' compress/...
compress/bzip2 -> bufio io sort
compress/flate -> bufio fmt io math sort strconv
compress/gzip -> bufio compress/flate errors fmt hash hash/crc32 io time
compress/lzw -> bufio errors fmt io
compress/zlib -> bufio compress/flate errors fmt hash hash/adler32 io
譯注: Windows 下有同樣有問題,要避免轉義字符串的干擾:
$ go list -f "{{.ImportPath}} -> {{join .Imports \" \"}}" compress/...
2.9 go tool
tool 命令允許特定的 go 工具,比如 compile 工具,我們可以在命令行中輸入 go tool cmd/compile 來查看具體的說明信息。compile 工具的基本用法為:
go tool compile [flags] file...
注意,這個命令的 file 文件必須是 Go 源代碼文件,并且屬于同一個包,[flags] 參數主要有以下幾個:
-N:禁止編譯器優化。-S:打印匯編語言列表到標準輸出窗口(只打印代碼code部分)。-S –S:打印匯編語言列表到標準輸出窗口(只打印代碼code和數據data)。-blockprofile file:將編譯期間采樣的block profile信息寫入文件file中。-cpuprofile file:將編譯期間采樣的cpu profile信息寫入文件file中。-dynlink:實驗特性,允許共享庫引用Go symbols。-e:移除錯誤報告的數量限制(默認限制是10)。-h:在檢測到第一個錯誤時停止棧跟蹤。-l:禁止函數內聯。-lang version:設置Go語言的版本。-m:打印編譯器的優化策略信息。-memprofile file:將編譯期間采樣的memory profile信息寫入文件file中。-memprofilerate rate:設置runtime.MemProfileRate的內存采集頻率。-mutexprofile file:將編譯期間采樣的mutex profile信息寫入文件file中。-race:開啟競爭檢測。-traceprofile file:將執行的跟蹤信息execution trace信息寫入文件file中。
2.9 go version
安裝 Go 后,一般會建議執行 go version 看看是否安裝成功,如下所示:
$ go version
go version go1.13.6 linux/amd64
$
但實際上,go version 還有其他用途,先 go help version 看看:
$ go help version
usage: go version [-m] [-v] [file ...]Version prints the build information for Go executables.Go version reports the Go version used to build each of the named
executable files.If no files are named on the command line, go version prints its own
version information.If a directory is named, go version walks that directory, recursively,
looking for recognized Go binaries and reporting their versions.
By default, go version does not report unrecognized files found
during a directory scan. The -v flag causes it to report unrecognized files.The -m flag causes go version to print each executable's embedded
module version information, when available. In the output, the module
information consists of multiple lines following the version line, each
indented by a leading tab character.See also: go doc runtime/debug.BuildInfo.
可見這個命令主要是用于輸出 Go 可執行文件的編譯信息的,只是如果沒有提供可執行文件,則輸出當前安裝的 Go 版本信息。
總結
以上是生活随笔為你收集整理的Go 学习笔记(37)— 标准命令(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个范丞丞qq网名
- 下一篇: Go 学习笔记(39)— Go 反射