Go言語のテンプレート(html/template)でHTMLを生成する方法
生徒
「先生、GoでWebアプリを作るときにHTMLを動的に生成したいんですが、どうすればいいですか?」
先生
「その場合、Goのhtml/templateパッケージを使うと便利です。HTMLテンプレートを作り、Goのデータを埋め込むことができます。」
生徒
「テンプレートって、どんなイメージですか?」
先生
「テンプレートは雛形のようなもので、変わる部分にデータを埋め込むことで、同じHTMLの構造を使いまわすことができます。」
1. html/templateパッケージとは?
Goのhtml/templateは、HTMLファイルをテンプレートとして読み込み、動的に文字列や変数を埋め込むことができる標準ライブラリです。これを使うと、ログインユーザー名やリストの情報をHTMLに反映させることができます。
2. テンプレートの基本構文
テンプレートでは、変数を{{.変数名}}のように埋め込みます。{{.}}はデータ構造の中身を参照するための記号です。
例えば、{{.Name}}と書くと、Go側で渡した構造体のNameフィールドの値がHTMLに表示されます。
3. 簡単なテンプレートの例
package main
import (
"html/template"
"net/http"
)
type User struct {
Name string
}
func handler(w http.ResponseWriter, r *http.Request) {
tmpl := template.Must(template.ParseFiles("index.html"))
user := User{Name: "Gopher"}
tmpl.Execute(w, user)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
この例では、index.htmlというテンプレートファイルにUser構造体のデータを渡しています。
4. テンプレートファイルの内容例
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Goテンプレート例</title>
</head>
<body>
<h1>こんにちは、{{.Name}}さん!</h1>
</body>
</html>
ブラウザで表示すると「こんにちは、Gopherさん!」と動的に表示されます。
5. 条件分岐とループの使用
テンプレート内では{{if 条件}}や{{range 配列}}を使って条件分岐や繰り返し処理も可能です。
<ul>
{{range .Items}}
<li>{{.}}</li>
{{end}}
</ul>
Go側でItemsに配列を渡すと、リストとしてHTMLに反映されます。
6. テンプレートでの安全性
html/templateは、XSS(クロスサイトスクリプティング)対策として自動で特殊文字をエスケープします。例えば<や>をHTMLタグとして解釈せず、安全に表示できます。
7. 複数テンプレートの管理
複数のHTMLファイルを組み合わせてテンプレートを管理することも可能です。共通のヘッダーやフッターをtemplate.ParseFilesで読み込み、共通部分と個別ページを組み合わせて表示できます。
8. 実用的なWebアプリでの活用例
ユーザーのプロフィールページや商品一覧ページなど、動的なWebページを生成する際にテンプレートは非常に便利です。データベースから取得した情報をテンプレートに渡すだけで、HTMLを簡単に生成できます。