テキストファイルの埋め込み
テキストファイルの場合は、ソースコード自体に簡単に埋め込むことができます。逆引用符を使用して、次string
のようにリテラルを宣言します。
const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
最適化のヒント:
ほとんどの場合、リソースをに書き込むだけでよいのでio.Writer
、[]byte
変換の結果を保存することもできます。
var html = []byte(`
<html><body>Example...</body></html>
`)
// Sending it:
w.Write(html) // w is an io.Writer
注意しなければならないことは、生の文字列リテラルに逆引用符( `)を含めることができないことです。生の文字列リテラルにはシーケンスを含めることはできません(解釈された文字列リテラルとは異なります)。したがって、埋め込むテキストに逆引用符が含まれている場合は、この例のように、生の文字列リテラルを分割し、逆引用符を解釈された文字列リテラルとして連結する必要があります。
var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`
これらの連結はコンパイラーによって実行されるため、パフォーマンスは影響を受けません。
バイナリファイルの埋め込み
バイトスライスとして保存する
バイナリファイル(画像など)の場合、(結果のネイティブバイナリに関して)最もコンパクトで最も効率的なのは、ファイルのコンテンツを[]byte
ソースコードのとして持つことです。これは、go-bindataなどのサードパーティのtoos / librariesによって生成できます。
これにサードパーティライブラリを使用したくない場合は、バイナリファイルを読み取り、ファイル[]byte
の正確なコンテンツで初期化されるタイプの変数を宣言するGoソースコードを出力する簡単なコードスニペットを次に示します。
imgdata, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Print("var imgdata = []byte{")
for i, v := range imgdata {
if i > 0 {
fmt.Print(", ")
}
fmt.Print(v)
}
fmt.Println("}")
ファイルに0〜16バイトが含まれる場合の出力例(Go Playgroundで試してください):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
base64として保存 string
ファイルが「大きすぎない」(ほとんどの画像/アイコンが適格である)場合は、他にも実行可能なオプションがあります。ファイルのコンテンツをBase64に変換string
し、ソースコードに保存できます。アプリケーションの起動時(func init()
)または必要に応じて、元の[]byte
コンテンツにデコードできます。Goは、encoding/base64
パッケージでBase64エンコーディングをサポートしています。
(バイナリ)ファイルをbase64に変換するのstring
は次のように簡単です:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
結果のbase64文字列をソースコードに、たとえばとして保存しますconst
。
デコードは関数呼び出しの1つにすぎません。
const imgBase64 = "<insert base64 string here>"
data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte
引用通りに保管 string
base64として格納するよりも効率的ですが、ソースコードではバイナリデータの引用符付き文字列リテラルを格納する方が長くなる可能性があります。次のstrconv.Quote()
関数を使用して、引用符付きの文字列を取得できます。
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(strconv.Quote(string(data))
0から64までの値を含むバイナリデータの場合、出力は次のようになります(Go Playgroundで試してください)。
"\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"
(strconv.Quote()
それに引用符を追加して付加することに注意してください。)
この引用符で囲まれた文字列をソースコードで直接使用できます。次に例を示します。
const imgdata = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"
使用する準備ができており、デコードする必要はありません。引用解除は、コンパイル時にGoコンパイラによって行われます。
必要に応じて、バイトスライスとして保存することもできます。
var imgdata = []byte("\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?")