TL;DR
- Go 1.16からファイル内容をバイナリに埋め込むembedパッケージやディレクティブが追加された
- ただ、パスワードやAPIトークンなどのバレたらまずいデータは埋め込まないこと
- 実行ファイルにそのまま埋め込まれているので
- どうしても埋め込みたいなら予めcryptoパッケージでハッシュ化しておいた内容を埋め込むなどする
それでもバレるときはバレる
- これはGoに限った話ではない
- Windowsでいうリソースファイルの仕組みと同じようなもの
- センシティブな情報は安易に埋め込まない
embedの使い方
以下のコードで embed_data.json
の内容を実行バイナリに含むことができる
main.go
package main
import (
_ "embed"
"encoding/json"
"fmt"
)
//go:embed embed_data.json
var embedData []byte
// UserData ユーザーデータ(例:API実行用のユーザー)
type UserData struct {
Key1 string `json:"user"`
Key2 string `json:"password"`
}
func main() {
userData := UserData{}
err := json.Unmarshal(embedData, &userData)
if err != nil {
panic(err)
}
// 試しにデータを見る
fmt.Printf("%v\n", userData)
}
embed_data.json
{
"user": "hogehoge",
"password": "fugafuga"
}
実行結果
$ ./embed_test.exe
{hogehoge fugafuga}
実行ファイルを覗くと・・・?
embedは何に使うべきか?
色々あると思うが、個人的には以下がぱっと思いつくもの
- テンプレファイル
- 自動でMarkdownやテキストデータを出したいときの下地を埋め込む
- デフォルト設定ファイル
- ユーザーの設定ファイルがないときに使用する設定ファイル
- 依存データを無くしたいときのデータ埋め込み手段
- 「とにかくバイナリのみで動かしたい!」というとき
- etc...