[Golang] CLI
$ go run <file.go> # 編譯並執行
$ go run *.go # 等同於 go run .
$ go run -race main.go # 檢查有沒有 race condition 存在
$ go get <module_path> # 下載他人 package 的 source code
$ go get -u # 更新專案中的所有套件
$ go get <module_path>@none # 移除某個 module
$ go build # 編譯後放在 src 中的專案資料夾中
$ go build ./... # 編譯 module 資料夾中的所有內容
$ go install # 編譯後放置到 bin 資料夾中
$ go test # runs any tests associated with the current project
$ go test ./... # 對 module 資料夾中的所有測試檔案執行測試
$ go fmt # format 該資料夾中的所有檔案
$ cd $GOPATH
$ go env # 檢視 GOPATH GOROOT 等和 GO 有關的變數
$ go env GOPATH # 檢視當前設定的 GOPATH
$ go env -w GOPATH=/somewhere/else/bin # 設定環境變數
go install:將 go 程式碼編譯後存放在 GOBIN 中
透過 go install <package_path>
會將 go 程式碼進行編譯後,存放在 GOPATH 或 GOBIN 中。如果 GOBIN
有進行設定,執行檔(binaries)會安裝在該資料夾中;如果 GOPATH
有設定,而 GOBIN
沒有設定的話,執行檔則會安裝在 GOPATH/bin
資料夾中。
預設的情況下,
GOPATH
的路徑會是$HOME/go
。
為了方便起見,go
的指令接受「相對於工作目錄(working directory)的相對路徑」,預設則是「當前工作目錄中的 package」:
# 若我們在 module_path 為 example.com/user/hello 的資 料中,下面指令的效果皆相同
# go install <module_path>
$ go install example.com/user/hello
$ go install .
$ go install
go get:安裝套件
使用時機:
- 安裝執行檔
- 檢視原始碼
下載他人 package 的 source code:
- source code 會放在
~/go/src
資料夾中 - 如果裡面有 main 檔則自動變成編譯後的執行檔,放在
~/go/bin
資料夾中
$ go get github.com/go-training/drone-golang-example
# -u,update local package
# "..." 表示下載裡面的所有東西
$ go get -u -d github.com/inancgumus/learngo/...
# 指定下載特定版本
# pseudo version
go get github.com/example v0.0.0-20240429033948-22ebff41a7ee
# semantic version
go get github.com/a/b@v1.5.8
go get github.com/c/d@v3
go get github.com/e/f@v1.8
# strings
go get github.com/i/j@latest
go get github.com/k/l@upgrade
go get github.com/m/n@patch
# revision identifier
go get github.com/s/t@main
go get github.com/o/p@5ce8005990f77d06
go get github.com/q/r@3.0-beta6
go get github.com/s/t@staging
go build:將專案程式碼進行打包
# build 時帶入不同的環境變數,即可打包成不同作業系統下的執行檔
$ GOOS=darwin go build # OSX
$ GOOS=windows GOARCH=386 go build # Microsoft
$ GOOS=linux GOARCH=arm GOARM=7 go build # Linux
其他可打包的作業系統和環境變數可以參考 Source#Environment。
go mod
要稍微留意這裡的用字:
- modules 指的是下載下來的套件,例如
github.com/gin-contrib
- packages 指的是 modules 中的 package,例如,
github.com/gin-contrib/cors
的cors
就是 package - dependencies 則是泛指這兩個
# 初始化 go module
$ go mod init [module path]
# 「新增有用到」或「移除沒用到」的 module,並更新 go.mod 和 go.sum
$ go mod tidy [-v] # -v 可以看到詳細執行的結果
# 把用到的 dependencies 下載到 module 內的 vendor 資料夾,而不是 cache 在 $GOPATH/pkg/mod
$ go mod vendor [-v]
# 顯示該套件在專案中的哪裡別使用到。
# -m 預設是檢查 package,加上 -m 後會是檢查 modules
# -vendor 忽略掉在測試中使用到的情況
$ go mod why [-m] [-vendor] packages...
# 確認 dependencies 在下載後沒有被改動
$ go mod verify
# 將 module 下載到 local cache(GOPATH/pkg/mod/cache)
$ go mod download [flags] [path]@version
go clean
$ go clean -cache # 移除 build 和 test 後產生的 cache
$ go clean -i <package_name>... # 移除某一個套件,加上 -n 則是 dry run
$ go clean -modcache # 移除所有下載第三方套件的內容,適合用在想要確保未來的 build 是拿到最新版本的
$ go clean -testcache # 清除測試的 cache
$ go clean -cache -modcache # 移除所有 cache
參考
- Go 語言基礎實戰 (開發, 測試及部署) @ Udemy
- Golang — GOROOT、GOPATH、Go-Modules-三者的關係 介紹 @ medium