同樣在寫工具看到的
//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 的三大特性
路徑限制:
embed指令引用的路徑必須是相對路徑,且不能超出當前 Package 的目錄範圍(不能用../往上找)。因此它知道docs/api-spec.json就在你當前專案資料夾內。型別支援: 你可以將檔案嵌入為三種型別:
string:適合純文字檔。[]byte:適合圖片或 JSON。embed.FS:適合一次嵌入整個資料夾(例如整個前端 React 專案)。
部署優勢: 這是 Go 最強大的地方。因為檔案已經被嵌入到執行檔中了,你部署時只需要給對方一個
.exe(或 Linux 執行檔),不需要連同docs資料夾一起包過去,程式依然能讀到 API Spec。
另外這是Go 1.16 引入的特性,所以也要注意版本號,雖然這應該有些年代了,跟大家分享
沒有留言:
張貼留言