例によって行く: Embedディレクティブ

//go:embedコンパイラディレクティブで、プログラムが任意のファイルやフォルダをビルド時にGoバイナリに含めることを可能にします。embedディレクティブの詳細についてはこちらを参照してください

package main

embedパッケージをインポートします。このパッケージからエクスポートされた識別子を使用しないときは、_ "embed"でブランクインポートできます

import (
    "embed"
)

embedディレクティブはGoソースファイルを含むディレクトリに対する相対パスを受け入れます。このディレクティブはファイルの内容を、直後に続くstring変数に埋め込みます

//go:embed folder/single_file.txt
var fileString string

または、ファイルの内容を[]byteに埋め込みます。

//go:embed folder/single_file.txt
var fileByte []byte

ワイルドカードを使用して、複数のファイルやフォルダを埋め込むこともできます。これにはembed.FS型の変数が使用されます。embed.FS型は、単純な仮想ファイルシステムを実装します。

//go:embed folder/single_file.txt
//go:embed folder/*.hash
var folder embed.FS
func main() {

single_file.txtの内容を出力します。

    print(fileString)
    print(string(fileByte))

埋め込まれたフォルダからファイルを取得します。

    content1, _ := folder.ReadFile("folder/file1.hash")
    print(string(content1))
    content2, _ := folder.ReadFile("folder/file2.hash")
    print(string(content2))
}

以下のコマンドを使用して、例を実行します。(注意: go playgroundの制限のため、この例はローカルマシンでのみ実行できます)

$ mkdir -p folder
$ echo "hello go" > folder/single_file.txt
$ echo "123" > folder/file1.hash
$ echo "456" > folder/file2.hash
$ go run embed-directive.go
hello go
hello go
123
456

次の例: Testing and Benchmarking