Quantcast
Channel: いろいろ備忘録日記
Viewing all articles
Browse latest Browse all 1460

Goメモ-146 (embed メモ (単独ファイル, embed.FSで取得))

$
0
0

概要

Go 1.16 から追加となった embedパッケージについてのメモ3個目。

前回は以下。

devlights.hatenablog.com

devlights.hatenablog.com

embedパッケージのドキュメントは以下。

golang.org

今回は、単独のファイルを埋め込んで、その内容を 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.txtvar 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
    }

    returnnil
}

実行すると以下のようになります。

$ 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"000000006865 6c 6c 6f 0a 77 6f  72 6c 64                 |hello.world|


[Elapsed]148.453µs

埋め込みを指示している //go:embed helloworld.txtの部分がちゃんと動作していますね。実行時には当然 helloworld.txt は必要ありません。

注意点として、バイナリにはそのまま埋め込まれていますので、バイナリエディタとかで除くと当然丸見えです。センシティブなデータは埋め込まないようにしましょう。(しないと思いますが)

参考資料

golang.org


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com


Viewing all articles
Browse latest Browse all 1460

Trending Articles