【Go】standard libraryのtext/templateを使って、簡単に文字列を作成・加工しよう!
現在開発中のアプリケーションで実装するメール送信機能には、送信先ごとにメール本文の一部を個別にカスタマイズする仕様が存在します。
これを実装するにあたって、Goのtext/template
パッケージの機能がとても役に立ったので、今回も備忘録代わりにまとめてみました。
それでは早速使い方を見ていきましょう。
テンプレートに文字列を渡すシンプルな使い方
以下はシンプルな使い方のコード例です。
// テンプレートの基となる文字列
const templateText = "吾輩は{{.}}である。"
// 上の文字列を基にテンプレートを作成
// Newの引数の"test"はテンプレートの名前
// 今回は本筋と関係ないので説明は省略
t, err := template.New("test").Parse(templateText)
if err != nil {
log.Fatal(err)
}
// Executeメソッドの第二引数にテンプレートで使用するデータを渡す
// そのデータを使用してテンプレートから文字列を作成しExecuteの第一引数に出力する
if err = t.Execute(os.Stdout, "猫"); err != nil {
log.Fatal(err)
}
出力結果
吾輩は猫である。
テンプレート文の{{.}}
の部分にExecute
メソッドの第二引数に渡されたデータが埋め込まれているのがわかります。
テンプレートに構造体を渡す使い方
次に、構造体を使用してもう少し複雑なテンプレートから文字列を作成してみます。
const introductions = "私の名前は{{.Name}}です。\n趣味は{{.Hobby}}です。\n"
// テンプレートにデータを渡す際に使用する構造体を定義
type Human struct {
Name string
Hobby string
}
member := []Human{
{
Name: "alice",
Hobby: "running",
},
{
Name: "bob",
Hobby: "cooking",
},
}
t, err := template.New("test").Parse(introductions)
if err != nil {
log.Fatal(err)
}
for _, v := range member {
// テンプレートにHuman型の構造体を渡している
if err = t.Execute(os.Stdout, v); err != nil {
log.Fatal(err)
}
}
出力結果
私の名前はaliceです。
趣味はrunningです。
私の名前はbobです。
趣味はcookingです。
{{.Name}}
の部分にHuman
構造体のName
フィールドの値が、{{.Hobby}}
部分にHobby
の値が入っていることがわかります。
今回はExecute
メソッドの第二引数に構造体のデータを渡しましたが、以下のようにmapにも対応しています。
colin := map[string]string{
"Name": "colin",
"Hobby": "swimming",
}
// 構造体ではなくmapでも問題なく出力してくれる
if err = t.Execute(os.Stdout, colin); err != nil {
log.Fatal(err)
}
出力結果
私の名前はcolinです。
趣味はswimmingです。
テキストファイルを使ってテンプレートを作成する方法
text/template
パッケージのParseFiles
関数を使うことで実装可能です。
type TestResult struct {
Name string
Math uint
Science uint
}
testResult := []TestResult{
{
Name: "alice",
Math: 80,
Science: 90,
},
{
Name: "bob",
Math: 87,
Science: 80,
},
}
// text-file.txtという名前のファイルの内容からテンプレートを作成
t, err := template.ParseFiles("text-file.txt")
if err != nil {
log.Fatal(err)
}
for _, v := range testResult {
if err = t.Execute(os.Stdout, v); err != nil {
log.Fatal(err)
}
}
test-file.txt
の内容
{{.Name}}さんのテストの点数は
数学:{{.Math}}
理科:{{.Science}}
です。
出力結果
aliceさんのテストの点数は
数学:80
理科:90
です。
bobさんのテストの点数は
数学:87
理科:80
です。
このようにtext/template
パッケージのParseFiles
関数を使用してファイルの情報を取り込みテンプレートを作成することができます。メール文などの長文をテキストファイルとして用意しておく場合に便利です。
ファイルから文字列を取得する方法は他の方法もあるので、どの方法にするかは状況などを鑑みて選択していく必要がありそうです。
さいごに
text/template
パッケージの機能の一部を紹介しました。
今回は基本的な機能の紹介に留まりましたが、本パッケージにはもっと高度な処理を可能にする機能もあるので、興味がある方はドキュメントを覗いてみてください。
この記事を書いた人
-
これまで農業、士業と経験し、まったく異業種のエンジニアとしてアーティスに入社。
現在は事業開発部でバックエンドエンジニアとして仕事に従事。可読性の高いコードが書けるよう日々勉強中。趣味は一人旅。
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー