本文 AI 產出,尚未審核
Go 語言概論 – 第一個 Go 程式(Hello World)
簡介
在任何程式語言的學習路程中,「Hello World」 都是第一道門檻。它不只是一行印出文字的程式碼,更是讓你快速驗證開發環境、熟悉語言基本結構、體驗編譯與執行流程的最佳起點。對於剛接觸 Go(又稱 Golang)的同學而言,完成第一個 Hello World 後,你會對以下幾件事有直觀的感受:
- Go 的工具鏈(
go run、go build)如何協同工作。 - 程式入口(
package main、func main())的必備寫法。 - 標準輸出(
fmt.Println)的使用方式。
掌握這些基礎後,你就能順利進入更深入的主題,如併發、模組管理與錯誤處理等。本文將一步步帶你建立第一個 Go 程式,並說明背後的概念、常見陷阱與實務應用。
核心概念
1. Go 程式的最小結構
package main // 1️⃣ 必須是 main 套件,表示可執行檔
import "fmt" // 2️⃣ 匯入 fmt 套件,用於格式化輸出
func main() { // 3️⃣ 程式入口點,執行時會從這裡開始
fmt.Println("Hello, World!") // 4️⃣ 印出字串並自動換行
}
| 項目 | 說明 |
|---|---|
package main |
只有 main 套件才能產生可直接執行的二進位檔。 |
import "fmt" |
fmt 為標準庫(standard library)的一部份,提供 I/O、字串格式化等功能。 |
func main() |
main 函式是程式的入口點,執行完畢後程式結束。 |
fmt.Println |
Println 會自動在字串後加上換行符號 (\n)。 |
小技巧:在 VS Code 或 GoLand 等 IDE 中,輸入
package main後按Ctrl+Space,會自動補全import與func main(),大幅提升開發效率。
2. 編譯與執行
Go 提供兩種常見的執行方式:
| 指令 | 說明 |
|---|---|
go run hello.go |
直接編譯並執行,適合快速測試。 |
go build -o hello hello.go./hello |
先產生執行檔,再自行執行,適合部署或效能測試。 |
注意:
go run會在背景產生臨時檔案,若程式碼量大或需要多次測試,建議改用go build。
3. 變數與常數的宣告(延伸範例)
雖然 Hello World 本身不需要變數,但在實務開發中,你常會需要把字串抽離成變數或常數,以便日後維護。
package main
import "fmt"
const greeting = "Hello, World!" // 常數,編譯期就確定值
func main() {
var name string = "Gopher" // 變數,可在執行期改變
fmt.Println(greeting) // 印出常數
fmt.Printf("Welcome, %s!\n", name) // 使用格式化輸出
}
const定義的值在編譯期即被嵌入,效能較好。var允許在程式執行過程中改變值,適合需要動態資料的情境。
4. 多行字串與原始字面量(Raw String)
在需要輸出長段文字或程式碼範例時,Go 的原始字面量非常好用。
package main
import "fmt"
func main() {
raw := `這是一段原始字面量
可以直接保留換行與空格
不需要額外的跳脫字元 (\n, \t)`
fmt.Println(raw)
}
- 使用反引號 (
`) 包住的字串,會原樣保留內容,適合寫說明文件、SQL 查詢等。
5. 錯誤處理的最小範例
即使是最簡單的 Hello World,也可以示範 Go 的錯誤處理風格。
package main
import (
"fmt"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Usage: hello <name>")
return // 直接結束程式,避免後續錯誤
}
name := os.Args[1]
fmt.Printf("Hello, %s!\n", name)
}
os.Args取得命令列參數。- 透過
if判斷參數是否足夠,若不足則直接回傳訊息並提前結束 (return)。 - 這種「檢查錯誤、立即回報」的寫法是 Go 的慣用風格,避免深層巢狀的
else。
常見陷阱與最佳實踐
| 陷阱 | 說明 | 解決方式 |
|---|---|---|
忘記 package main |
編譯時會得到 cannot find main module 錯誤。 |
確認檔案最上方是 package main。 |
未匯入 fmt |
使用 fmt.Println 會出現 undefined: fmt。 |
加上 import "fmt",或使用別名 import f "fmt"。 |
使用 Print 而非 Println |
輸出後不會自動換行,結果會黏在一起。 | 需要換行時使用 Println,或自行加 \n。 |
直接在 main 裡寫大量程式碼 |
程式可讀性下降,難以測試。 | 把功能抽成獨立函式或套件,main 只負責呼叫。 |
| 忽略錯誤回傳 | Go 的函式常會回傳 (value, error),若不檢查會埋下隱憂。 |
每次收到 error 時,都使用 if err != nil { ... } 處理。 |
最佳實踐
- 保持
main簡潔:只做參數解析、設定、呼叫其他函式。 - 使用
go fmt或gofmt:自動格式化程式碼,確保風格一致。 - 加入模組管理 (
go.mod):即使是單檔程式,也建議執行go mod init example.com/hello,為未來擴充做好基礎。 - 寫測試:對於非 trivial 的程式,使用
*_test.go撰寫單元測試,go test ./...立即驗證。
實際應用場景
- 容器化微服務:在 Dockerfile 中常見的起始指令是
CMD ["./app"],而app往往是最簡單的main程式,先驗證「能成功編譯、能正確輸出」是上線前的必備檢查。 - CLI 工具:許多開發者會先寫一個
hello命令作為範例,之後再擴充成gopkg、kubectl插件等。 - 教學與示範:在技術部門的內部培訓或開源文件中,Hello World 是說明「如何使用
go run」的最直觀範例。
總結
本文從 最小可執行程式、編譯與執行指令、變數、字串、錯誤處理 四個層面,完整示範了 Go 的第一個程式——「Hello World」。透過表格與實務範例,我們也揭示了常見的陷阱與最佳實踐,讓讀者在寫完第一行程式後,就能養成良好的開發習慣。未來,你可以在此基礎上:
- 加入 環境變數、設定檔 讓程式更具彈性。
- 探索 goroutine 與 channel,體驗 Go 的併發優勢。
- 使用 模組化 (
go.mod) 與 套件管理,打造可維護的大型專案。
只要掌握了這個「Hello, World!」的核心概念,你就已經踏上了成為 Go 開發者的第一步。祝你在 Go 的世界裡寫出更多優雅、快速且可靠的程式!