コンテンツにスキップ

テンプレートエンジン/Go

出典: フリー教科書『ウィキブックス(Wikibooks)』

Goには、標準ライブラリとしてテンプレートエンジンが含まれているだけでなく、外部ライブラリとしてもさまざまなテンプレートエンジンが存在します。以下に、Go言語から使う代表的なテンプレートエンジンを挙げます。

標準ライブラリ

[編集]

text/template

[編集]
  • 特徴: プレーンテキストのテンプレート処理を行うための標準ライブラリ。メールテンプレートやログ生成などの用途に最適です。
  • 主な用途: テキスト生成。
  • 基本例:
    package main
    
    import (
        "os"
        "text/template"
    )
    
    func main() {
        tmpl := `Hello, {{.Name}}!`
        data := struct {
            Name string
        }{"Gopher"}
    
        t, _ := template.New("example").Parse(tmpl)
        t.Execute(os.Stdout, data)
    }
    
  • 利点: 標準ライブラリなので追加の依存が不要。
  • 制限: HTMLエスケープなどの安全性は自動では保証されない。

html/template

[編集]
  • 特徴: HTML用に特化したテンプレートエンジン。XSS(クロスサイトスクリプティング)対策として、自動的にHTMLをエスケープします。
  • 主な用途: ウェブページ生成。
  • 基本例:
    package main
    
    import (
        "html/template"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        tmpl := `<h1>Hello, {{.Name}}!</h1>`
        data := struct {
            Name string
        }{"Gopher"}
    
        t, _ := template.New("example").Parse(tmpl)
        t.Execute(w, data)
    }
    
    func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8080", nil)
    }
    
  • 利点: 自動エスケープにより安全性が高い。
  • 制限: 標準的な構文のみサポートし、拡張性に限りがある。

外部ライブラリ

[編集]

Jet

[編集]
  • 特徴: パフォーマンスに優れたテンプレートエンジン。テンプレートのプリコンパイルが可能。
  • 主な用途: 高速なテンプレート処理を求めるウェブアプリケーション。
  • 基本例:
    package main
    
    import (
        "github.com/CloudyKit/jet/v6"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        views := jet.NewHTMLSet("./templates")
        tmpl, _ := views.GetTemplate("example.jet")
        tmpl.Execute(w, nil, map[string]interface{}{
            "Name": "Gopher",
        })
    }
    
    func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8080", nil)
    }
    
  • 利点: 高速で柔軟性が高い。条件分岐やループのサポートも充実。
  • 制限: 標準ライブラリと異なり、依存を追加する必要がある。

Pongo2

[編集]
  • 特徴: PythonのDjangoテンプレートエンジンにインスパイアされたライブラリ。人間が読みやすい構文を採用。
  • 主な用途: Djangoに似た構文を好む開発者向け。
  • 基本例:
    package main
    
    import (
        "github.com/flosch/pongo2/v6"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        tmpl := pongo2.Must(pongo2.FromString("<h1>Hello, {{ name }}!</h1>"))
        tmpl.ExecuteWriter(pongo2.Context{"name": "Gopher"}, w)
    }
    
    func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8080", nil)
    }
    
  • 利点: Django風の簡潔な構文を利用可能。
  • 制限: 外部依存が必要で、標準ライブラリに比べて設定が複雑。

Mustache

[編集]
  • 特徴: 言語非依存のテンプレートエンジンで、シンプルな構文を提供。
  • 主な用途: 他言語と統一的にテンプレートを扱いたい場合。
  • 基本例:
    package main
    
    import (
        "github.com/hoisie/mustache"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        tmpl := `<h1>Hello, {{Name}}!</h1>`
        data := map[string]string{"Name": "Gopher"}
        w.Write([]byte(mustache.Render(tmpl, data)))
    }
    
    func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":8080", nil)
    }
    
  • 利点: シンプルで他の言語にも移植性が高い。
  • 制限: 制御構文が少なく、複雑なロジックには不向き。

選択基準

[編集]

それぞれの用途に応じてテンプレートエンジンを選択してください。Goの標準ライブラリは多くのケースで十分ですが、複雑な要件がある場合は外部ライブラリを検討するのがよいでしょう。