本文 AI 產出,尚未審核

Go 語言概論 – 第一個 Go 程式(Hello World)

簡介

在任何程式語言的學習路程中,「Hello World」 都是第一道門檻。它不只是一行印出文字的程式碼,更是讓你快速驗證開發環境、熟悉語言基本結構、體驗編譯與執行流程的最佳起點。對於剛接觸 Go(又稱 Golang)的同學而言,完成第一個 Hello World 後,你會對以下幾件事有直觀的感受:

  1. Go 的工具鏈go rungo build)如何協同工作。
  2. 程式入口package mainfunc main())的必備寫法。
  3. 標準輸出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,會自動補全 importfunc 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 { ... } 處理。

最佳實踐

  1. 保持 main 簡潔:只做參數解析、設定、呼叫其他函式。
  2. 使用 go fmtgofmt:自動格式化程式碼,確保風格一致。
  3. 加入模組管理 (go.mod):即使是單檔程式,也建議執行 go mod init example.com/hello,為未來擴充做好基礎。
  4. 寫測試:對於非 trivial 的程式,使用 *_test.go 撰寫單元測試,go test ./... 立即驗證。

實際應用場景

  • 容器化微服務:在 Dockerfile 中常見的起始指令是 CMD ["./app"],而 app 往往是最簡單的 main 程式,先驗證「能成功編譯、能正確輸出」是上線前的必備檢查。
  • CLI 工具:許多開發者會先寫一個 hello 命令作為範例,之後再擴充成 gopkgkubectl 插件等。
  • 教學與示範:在技術部門的內部培訓或開源文件中,Hello World 是說明「如何使用 go run」的最直觀範例。

總結

本文從 最小可執行程式編譯與執行指令變數、字串、錯誤處理 四個層面,完整示範了 Go 的第一個程式——「Hello World」。透過表格與實務範例,我們也揭示了常見的陷阱與最佳實踐,讓讀者在寫完第一行程式後,就能養成良好的開發習慣。未來,你可以在此基礎上:

  • 加入 環境變數設定檔 讓程式更具彈性。
  • 探索 goroutinechannel,體驗 Go 的併發優勢。
  • 使用 模組化 (go.mod) 與 套件管理,打造可維護的大型專案。

只要掌握了這個「Hello, World!」的核心概念,你就已經踏上了成為 Go 開發者的第一步。祝你在 Go 的世界裡寫出更多優雅、快速且可靠的程式!