2026年3月27日 星期五

golang註解嵌入

同樣在寫工具看到的

//go:embed docs/api-spec.json
var apiSpec []byte

func main() {
port := 8765

// 建立 server
srv := server.New(port)

// 從 embed 讀取預先掃描好的 spec
srv.SetSpec(apiSpec)

// 啟動 HTTP server (會開啟瀏覽器)
srv.Start()
}

我想說apiSpec沒有任何寫入動作,怎麼跑得出來,就去研究一下,原來是上方註解
//go:embed docs/api-spec.json
這行就代表

// 1. 定義檔案路徑(相對於執行程式時的目錄)
filePath := "docs/api-spec.json"

// 2. 傳統寫法:從硬碟讀取檔案
// 這會回傳 []byte 和 error
apiSpec, err := os.ReadFile(filePath)
if err != nil {
// 如果檔案不存在或權限不足,這裡會報錯
fmt.Printf("❌ 無法讀取檔案: %v\n", err)
os.Exit(1)
}

直接節省一大段程式,變得非常簡潔,但在使用上也是有些注意事項

//go:embed 的三大特性

  1. 路徑限制embed 指令引用的路徑必須是相對路徑,且不能超出當前 Package 的目錄範圍(不能用 ../ 往上找)。因此它知道 docs/api-spec.json 就在你當前專案資料夾內。

  2. 型別支援: 你可以將檔案嵌入為三種型別:

    • string:適合純文字檔。

    • []byte:適合圖片或 JSON。

    • embed.FS:適合一次嵌入整個資料夾(例如整個前端 React 專案)。

  3. 部署優勢: 這是 Go 最強大的地方。因為檔案已經被嵌入到執行檔中了,你部署時只需要給對方一個 .exe(或 Linux 執行檔),不需要連同 docs 資料夾一起包過去,程式依然能讀到 API Spec。

另外這是Go 1.16 引入的特性,所以也要注意版本號,雖然這應該有些年代了,跟大家分享

沒有留言:

張貼留言