跳至主要内容

[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/corscors 就是 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

參考