グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



【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パッケージの機能の一部を紹介しました。
今回は基本的な機能の紹介に留まりましたが、本パッケージにはもっと高度な処理を可能にする機能もあるので、興味がある方はドキュメントを覗いてみてください。

公式ドキュメント

この記事を書いた人

wanderlust
wanderlust事業開発部 web application engineer
これまで農業、士業と経験し、まったく異業種のエンジニアとしてアーティスに入社。
現在は事業開発部でバックエンドエンジニアとして仕事に従事。可読性の高いコードが書けるよう日々勉強中。趣味は一人旅。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします