Go バイナリにファイルを埋め込む

GolangGolangBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Go言語のembedパッケージに対する理解をテストします。embedパッケージを使うことで、プログラムはビルド時にGoバイナリに任意のファイルやフォルダを含めることができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/FileOperationsGroup(["File Operations"]) go/FileOperationsGroup -.-> go/embed_directive("Embed Directive") subgraph Lab Skills go/embed_directive -.-> lab-15469{{"Go バイナリにファイルを埋め込む"}} end

埋め込みディレクティブ

与えられたコードを修正して、ファイルとフォルダをGoバイナリに埋め込み、その内容を表示することがあなたの課題です。

  • ファイルとフォルダを埋め込むには、embedパッケージを使用する必要があります。
  • 埋め込まれたファイルの内容を格納するには、string型と[]byte型を使用する必要があります。
  • ワイルドカードを使って複数のファイルやフォルダを埋め込むには、embed.FS型を使用する必要があります。
  • 埋め込まれたファイルの内容を表示する必要があります。
## これらのコマンドを使ってサンプルを実行します。
## (注: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

以下に完全なコードがあります。

// `//go:embed`は、プログラムがビルド時にGoバイナリに任意のファイルやフォルダを含めることを可能にする
// [コンパイラディレクティブ](https://pkg.go.dev/cmd/compile#hdr-Compiler_Directives)です。
// 埋め込みディレクティブに関する詳細は、
// [ここ](https://pkg.go.dev/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型](https://pkg.go.dev/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バイナリにファイルとフォルダを埋め込む方法としてembedパッケージを使う方法を学びました。また、埋め込まれたファイルの内容を格納するためのstring型と[]byte型の使い方、およびワイルドカードを使って複数のファイルやフォルダを埋め込むためのembed.FS型の使い方も学びました。