Golangでテンプレートを使用する方法

Golang

この記事では、プログラミング言語Goにおけるテンプレートとその使用方法について説明します。

テンプレートとは?

テンプレートは共通のビューであり、そのビューを意味のあるものにするためにデータを渡すことができます。

またテンプレートは、あらゆる方法でカスタマイズすることができ、あらゆる出力を得ることができます。

Golangのtemplateパッケージ

Goのテンプレート作成には、text/templateとhtml/templateの2つのパッケージがあります。

textパッケージはテキストをテンプレートに挿入することを可能にし、一方、HTMLテンプレートは安全なHTMLコードを提供することによって私たちを助けてくれます。

テンプレートの部品

使い始める前に、コードのさまざまな部分を見てみましょう。

テンプレートアクション

テンプレートアクションとは、主な制御フロー、データ評価、関数のことです。これらのアクションは、最終的な出力がどのように表示されるかを制御します。

以下に、いくつかの基本的なアクションを紹介します。

{{ /* a comment inside template */ }}

ルート要素をレンダリングする場合は以下の通り。

{{ . }}

制御構造

制御構造は、テンプレートの制御フローを決定します。構造化された出力を生成するのに役立ちます。以下は、テンプレートにおける制御構造の例です。

if文は以下の書き方

{{ if .condition }} {{ else }} {{ end }}

rangeブロックは以下の書き方

{{ range .Items }} {{ end }}

Rangeブロックは、指定されたリストに対して反復処理を行います。

関数

関数はテンプレートの中でも使用することができます。

パイプ(|)演算子を使って、定義済みの関数を使うことができます。

Golangでテンプレートをパースする

いくつかのテキストと HTML テンプレートを解析してみます。

データにアクセスする

渡されたデータにアクセスするには、以下のようにドット(.)構文を使用します。

{{ .data }}

textテンプレートのパース

以下のようにテキストテンプレートをパースします。

package main
 
import (
    "os"
    "text/template"
)
 
type User struct {
    Name    string
    Bio     string
}
 
func main() {
    u := User{"Tanaka", "a regular user"}
 
    ut, err := template.New("users").Parse("The user is {{ .Name }} and he is {{ .Bio }}.")
     
    if err != nil {
        panic(err)
    }
 
    err = ut.Execute(os.Stdout, u)
 
    if err != nil {
        panic(err)
    }
}

上のコードでは、構造体をテキストテンプレートに渡すと、次のような出力が得られます。

The user is Tanaka and he is a regular user.

HTMLテンプレートのパース

HTML文書を解析してみましょう。この例では、以下のショーコードを使用します。

hello.gohtmlファイルにおいて以下を記述し、

<h1>Go templates</h1>
<p>The user is {{ .Name }}</p>
<h2>Skills:</h2>
{{ range .Skills }} 
    <p>{{ . }}</p>
{{ end }}

main.goファイルに以下を記述します。

package main
 
import (
    "os"
    "html/template"
)
 
func main() {
    t, err := template.ParseFiles("templates/hello.gohtml")
 
    if err != nil {
        panic(err)
    }
 
    data := struct {
        Name string
        Skills []string
    }{
        Name: "John Doe",
        Skills: []string{
            "C++",
            "Java",
            "Python",
        },
    }
 
    err = t.Execute(os.Stdout, data)
 
    if err != nil {
        panic(err)
    }
}

Golangでのテンプレート検証

テンプレートが有効かどうかを確認するために、template.Must()関数を使用します。これはパース中にテンプレートを検証するのに役立ちます。

tmp := template.Must(template.ParseFiles("tmp.html"))

Golangにおけるテンプレート化の使用法

テンプレートは、一般的なWebページ制作のみならず、以下のような様々な条件下で非常に有用です。

  • APIからのデータを使ってWebページを生成する。
  • メールを生成する
  • HUGOテンプレートによるWebサイトの作成。
タイトルとURLをコピーしました