概要
Go 1.16 から追加となった embed
パッケージについてのメモ3個目。
前回は以下。
embed
パッケージのドキュメントは以下。
今回は、単独のファイルを埋め込んで、その内容を embed.FS
で取得するサンプルです。
embed.FS
は、こちらも Go1.16 で追加された io/fs
の 各インターフェースを embed 側で実装しているものです。
embed.FS
は、以下のインターフェースを実装しています。
- fs.ReadDirFS
- fs.ReadFileFS
なので、ファイルとディレクトリの両方を扱えるってことですね。
サンプル
以下のサンプルでは、同一ディレクトリに配置されている helloworld.txt
を埋め込んで利用しています。
helloworld.txt というファイルは以下の内容です。
hello world
んで、利用する側は以下のような感じ。
package embeds import ( "embed" "encoding/hex" "os" ) //go:embed helloworld.txt var f embed.FS // EmbedFsSingleFile は、embed パッケージの機能を確認するサンプルです (embed.FSとして単独ファイルを操作) func EmbedFsSingleFile() error { b, err := f.ReadFile("helloworld.txt") if err != nil { return err } dumper := hex.Dumper(os.Stdout) defer dumper.Close() if _, err := dumper.Write(b); err != nil { return err } return nil }
実行すると以下のようになります。
$ make run go get -d ./... go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example "" ENTER EXAMPLE NAME: embed_fs_singlefile [Name] "embed_fs_singlefile" 00000000 68 65 6c 6c 6f 0a 77 6f 72 6c 64 |hello.world| [Elapsed] 148.453µs
埋め込みを指示している //go:embed helloworld.txt
の部分がちゃんと動作していますね。実行時には当然 helloworld.txt は必要ありません。
注意点として、バイナリにはそのまま埋め込まれていますので、バイナリエディタとかで除くと当然丸見えです。センシティブなデータは埋め込まないようにしましょう。(しないと思いますが)
参考資料
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場