Golang – Go 語言概論
安裝與環境設定(Go 工具鏈、GOPATH、GOROOT)
簡介
在開始撰寫 Go 程式之前,環境的正確安裝與設定是成功開發的第一步。Go 以其簡潔的工具鏈、快速的編譯速度與一致的跨平台行為聞名,但若開發者對 GOROOT、GOPATH、以及常用指令 (go build、go run、go test …) 沒有清晰的概念,往往會在專案管理或套件相依上卡關。
本篇文章將帶你從 下載安裝、檢查工具鏈、設定工作目錄 三個層面,完整了解 Go 的環境變數與實務應用,讓你能在本機或 CI/CD 環境中,快速、穩定地編譯與執行 Go 程式。
核心概念
1. Go 工具鏈概述
Go 官方提供的工具鏈只需要一個可執行檔 go,它內建以下功能:
| 指令 | 功能說明 |
|---|---|
go version |
顯示目前安裝的 Go 版本 |
go env |
列出所有環境變數與其值 |
go build |
編譯套件或可執行檔 |
go run |
直接編譯並執行單一檔案(適合快速測試) |
go test |
執行套件的單元測試 |
go get |
下載遠端套件(自 Go 1.17 起已被 go install 取代) |
go mod |
管理模組(module)相依 |
小技巧:在終端機輸入
go help可以看到完整指令說明。
2. GOROOT – Go 安裝目錄
GOROOT 指向 Go 語言本身的安裝位置,預設情況下不需要手動設定。舉例:
| 作業系統 | 預設 GOROOT |
|---|---|
| Windows | C:\Go |
| macOS (Homebrew) | /usr/local/opt/go/libexec |
| Linux | /usr/local/go |
注意:若自行編譯或安裝自訂路徑,必須手動設定
GOROOT,否則go env會顯示空值,導致編譯器找不到標準函式庫。
範例:檢查 GOROOT
$ go env GOROOT
/usr/local/go
3. GOPATH – 工作目錄
GOPATH 是 開發者自訂的工作空間,用來存放:
- src:原始碼(依照 import path 結構)
- pkg:已編譯的套件(
.a檔) - bin:可執行檔(
go install產出的二進位)
自 Go 1.11 起,模組(module)機制 讓 GOPATH 不再是必須,但仍有以下情境會使用到:
- 舊有專案尚未遷移至
go.mod - 想要快速測試
go get下載的套件位置
預設 GOPATH
- Windows:
%USERPROFILE%\go - macOS / Linux:
$HOME/go
範例:設定 GOPATH(bash)
# 在 ~/.bash_profile 或 ~/.zshrc 加入
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
提醒:
PATH必須加入$GOPATH/bin,才能在終端機直接呼叫go install產生的執行檔。
4. 使用 go.mod 建立模組(推薦做法)
即使有 GOPATH,在新專案中仍建議使用 Go 模組,它會自動在專案根目錄產生 go.mod,管理相依與版本。
$ mkdir hello && cd hello
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
此時 go.mod 內容如下:
module example.com/hello
go 1.22
模組的好處:
- 不再依賴全域
GOPATH - 版本控制更精細(可指定套件版本)
- CI/CD 中更易重現環境
程式碼範例
以下提供 4 個常見的實務範例,示範如何在正確的環境設定下編譯、執行與測試 Go 程式。
範例 1:Hello World(使用 go run)
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
執行:
$ go run hello.go
Hello, Go!
適合快速驗證環境是否正常。
範例 2:建立可執行檔(go build)
// cmd/app/main.go
package main
import (
"log"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello from Go server!"))
}
func main() {
http.HandleFunc("/", helloHandler)
log.Println("Server listening on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
編譯與執行:
$ go build -o bin/app cmd/app/main.go # 產生 bin/app
$ ./bin/app
2025/12/19 10:00:00 Server listening on :8080
範例 3:使用模組安裝第三方套件
$ go get github.com/google/uuid
go: downloading github.com/google/uuid v1.3.0
在程式中使用:
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id := uuid.New()
fmt.Printf("產生的 UUID: %s\n", id)
}
執行:
$ go run .
產生的 UUID: 9f8c2e2b-6d5b-4c9e-9c1a-3f6e5b2d4a7c
範例 4:單元測試(go test)
// math/adder.go
package math
func Add(a, b int) int {
return a + b
}
// math/adder_test.go
package math
import "testing"
func TestAdd(t *testing.T) {
got := Add(2, 3)
want := 5
if got != want {
t.Fatalf("Add(2,3) = %d; want %d", got, want)
}
}
測試指令:
$ go test ./math
ok _/path/to/project/math 0.001s
常見陷阱與最佳實踐
| 陷阱 | 說明 | 解決方式 |
|---|---|---|
| GOROOT 被誤改 | 手動設定 GOROOT 為錯誤路徑,導致標準函式庫找不到。 |
只在自行編譯 Go 時才設定;平時保持空值或使用官方安裝路徑。 |
| GOPATH 與模組混用 | 同時依賴 GOPATH/src 與 go.mod,相依版本衝突。 |
盡量 全部使用模組,舊專案可先 go mod init 再搬移。 |
| PATH 未加入 $GOPATH/bin | go install 後無法直接執行產出的二進位。 |
在 .bashrc / .zshrc 加入 export PATH=$PATH:$GOPATH/bin。 |
| 不同 Go 版本的二進位相容性 | 在同一機器上安裝多個版本,執行時可能跑錯版本。 | 使用工具如 asdf、gvm 或 Docker 來管理版本。 |
| 忘記設定代理(proxy) | 在中國大陸或受限網路環境,go get 會失敗。 |
設定 GOPROXY=https://goproxy.cn,direct 或其他可用代理。 |
最佳實踐
- 使用模組:
go.mod為未來的標準,避免依賴全域GOPATH。 - 保持工具鏈最新:每半年檢查
go version,升級至官方支援的 LTS 版本。 - 版本控制
go.mod、go.sum:確保團隊成員取得相同相依。 - 使用 CI 檢查環境:在 GitHub Actions、GitLab CI 中加入
go env與go test步驟,確保環境一致。 - 設定代理(若需要):在
.bashrc中加入export GOPROXY=https://proxy.golang.org,direct,提升下載穩定性。
實際應用場景
| 場景 | 為何需要正確的環境設定 | 典型流程 |
|---|---|---|
| 微服務開發 | 每個服務都會有自己的 go.mod,必須確保編譯出相容的二進位。 |
go build -o ./bin/serviceA ./cmd/serviceA → Dockerfile COPY → 部署 |
| CI/CD 自動化測試 | CI 執行環境通常是乾淨的容器,必須在腳本中明確安裝指定 Go 版本與設定 GOPROXY。 |
actions/setup-go@v5 → go test ./... |
| 本地開發與調試 | 開發者常在 IDE(VSCode、GoLand)中使用 go run、go test,環境變數錯誤會導致編譯失敗。 |
設定 IDE 的 Go SDK 路徑 → GOPATH 自動偵測 |
| 跨平台編譯 | 想要一次編譯 Windows、Linux、macOS 可執行檔,需要正確設定 GOOS、GOARCH,但仍依賴正確的 GOROOT。 |
GOOS=linux GOARCH=amd64 go build -o app-linux |
總結
- Go 工具鏈 只需要一個
go可執行檔,掌握go env、go build、go run等指令即可完成大部分開發工作。 - GOROOT 代表 Go 本身的安裝位置,除非自行編譯,通常不需要手動設定。
- GOPATH 是舊式的工作目錄,現代開發建議以 模組(go.mod) 為主,僅在遺留專案或特定需求時使用。
- 正確設定
PATH、GOPROXY,以及在 CI/CD 中明確指定 Go 版本,是避免「環境不一致」問題的關鍵。
只要依照本文的步驟完成安裝與環境設定,你就能在本機、容器或雲端平台上,無縫編譯、測試、部署 Go 應用程式,為後續的語法學習與實務開發奠定穩固基礎。祝開發順利,玩得開心!