網頁

2022/1/7

Golang 檔案嵌入變數 embed file content to var

Go embed package使用方法如下。


Go 1.16推出的新功能embed package可透過//go:embeded提示(directive)將檔案內容放入變數。

範例環境:

  • Go 1.17


範例

範例專案目錄結構如下。

/
├──tmp/
│  ├──a.txt
│  └──b.txt
├──go.mod
├──hello.txt
└──main.go

專案以下文藝檔內容如下。

hello.txt

Hello world

a.txt

Apple

b.txt

Banana


Embed to string

下面在根目錄的main.go匯入embed package,然後使用//go:embed hello.txt取得hello.txt的內容並放入字串變數s。注意斜線/後不可有空白,例如// go:embed是無效的。

main.go

package main

import (
    _ "embed"
    "fmt"
)

//go:embed hello.txt
var s string

func main() {
    fmt.Println(s) // Hello world
}

執行印出內容如下。

Hello world


Embed to byte[]

也可把檔案內容放入[]byte slice中。

main.go

package main

import (
    _ "embed"
    "fmt"
)

//go:embed tmp
var tmp embed.

func main() {
    fmt.Println(string(b)) // Hello world
}


Embed to FS

除了單一檔案,也可取得檔案系統目錄及多個檔案。

下面使用go:embed tmp/*go:embed hello.txt取得tmp目錄中的檔案及hello.txt放入型態為embed.FS的變數fembed.FS實作io/fspackage的FS介面。

package main

import (
    "embed"
    "fmt"
)

//go:embed hello.txt
//go:embed tmp/*
var f embed.FS

func main() {
    data, _ := f.ReadFile("hello.txt")
    fmt.Println(string(data)) // Hello world

    data, _ = f.ReadFile("tmp/a.txt")
    fmt.Println(string(data)) // Apple

    data, _ = f.ReadFile("tmp/b.txt")
    fmt.Println(string(data)) // Banana
}

執行印出內容如下。

Hello world
Apple
Banana

github

沒有留言:

張貼留言