Go言語テンプレートの再利用方法を初心者向けに解説

JavaScriptを有効にしてください

まえがき

Go言語には、HTMLやテキストを動的に生成するための便利なテンプレート機能があります。特にWebアプリケーション開発では、同じテンプレートを複数のページで再利用することが多くあります。今回は初心者の方向けに、Go言語のテンプレート機能を再利用する方法について、基本的な使い方から実用的な例、利点、注意点まで詳しく解説していきます。

Go言語のテンプレート機能の基本的な使い方については下記記事をお読みください。
Go言語のテンプレート機能を初心者向けに解説

Go言語テンプレートの再利用方法

実際のWebアプリケーションでは、ヘッダーやフッターなどの共通部分を複数のページで再利用したいことがあります。Go言語では、テンプレートを複数のファイルに分割して再利用することが可能です。

テンプレートの呼び出し方は、templateblockの2つがあります。
それぞれの違いについて学んでいきましょう。

template でテンプレートを呼び出す

template は、事前に定義されたテンプレートを指定した場所に挿入 するために使用します。

テンプレートの定義方法

テンプレートとして再利用したい部分を {{ define "template_name" }} で囲んで定義します。

1
2
3
{{ define "header" }}
<header>ヘッダーの内容</header>
{{ end }}

テンプレートの呼び出し

定義したテンプレートは {{ template "template_name" }} で呼び出せます。

1
<p>{{ template "header" }}</p>

実際の出力結果

1
<p><header>ヘッダーの内容</header></p>

block でテンプレートを呼び出す

block は、デフォルトの内容を持ちながら、後から上書きできる 仕組みです。
template は単に挿入するだけなのに対し、block は上書き可能)

テンプレートの定義方法

デフォルトの内容を設定して block を作成できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{{ define "base" }}
<!DOCTYPE html>
<html>
<head>
    <title>サイトタイトル</title>
</head>
<body>
    <main>
        {{ block "content" . }}デフォルトのコンテンツ{{ end }}
    </main>
</body>
</html>
{{ end }}

別のテンプレートで上書き

上書きしたい場合は、defineblock と同じ名前のテンプレートを定義します。

1
2
3
{{ define "content" }}
<p>上書きされたコンテンツ</p>
{{ end }}

実際の出力結果

  • content テンプレートを定義した場合:
1
2
3
<main>
    <p>上書きされたコンテンツ</p>
</main>
  • content テンプレートがない場合:
1
2
3
<main>
    デフォルトのコンテンツ
</main>

templateblock の違い

機能 {{template "name"}} {{block "name"}} ... {{end}}
役割 既存のテンプレートを呼び出す デフォルトを持ちつつ上書きできる
デフォルトの内容 挿入するだけでデフォルトなし block 内にデフォルトを書ける
上書き可能か できない define で後から上書きできる

使い分け

  • template → そのまま使い回したいテンプレート(ヘッダーやフッターなど)
  • block → デフォルトの内容を持ちつつ、ページごとにカスタマイズ可能な部分(コンテンツ部分など)

この違いを理解すると、Goのテンプレートを柔軟に使えるようになります!

実用的な使用例

例えば、以下のようなファイル構成を考えてみましょう。

1
2
3
4
templates/
├── base.html
├── header.html
└── index.html
  • base.html(共通レイアウト)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>{{.Title}}</title>
</head>
<body>
    {{template "header" .}}
    <main>
        {{block "content" .}}{{end}}
    </main>
</body>
</html>
  • header.html(ヘッダー部分)
1
2
3
4
5
{{define "header"}}
<header>
    <h1>{{.Header}}</h1>
</header>
{{end}}
  • index.html(個別ページ)
1
2
3
{{define "content"}}
<p>ようこそ、{{.User}}さん!</p>
{{end}}

これらのテンプレートを読み込み、実行するGoのコードは以下のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
    "html/template"
    "os"
)

func main() {
    tmpl, err := template.ParseFiles(
        "templates/base.html",
        "templates/header.html",
        "templates/index.html",
    )
    if err != nil {
        panic(err)
    }

    data := struct {
        Title  string
        Header string
        User   string
    }{
        Title:  "ホームページ",
        Header: "もふもふブログ",
        User:   "もふもふ",
    }

    tmpl.ExecuteTemplate(os.Stdout, "base.html", data)
}

実行すると以下のようなHTMLが生成されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ホームページ</title>
</head>
<body>
    <header>
        <h1>もふもふブログ</h1>
    </header>
    <main>
        <p>ようこそ、もふもふさん!</p>
    </main>
</body>
</html>

このように、テンプレートを分割して再利用することで、コードの重複を避け、メンテナンス性を向上させることができます。

Go言語テンプレート再利用の利点

Go言語でテンプレートを再利用することには以下のような利点があります。

  • コードの重複を避けられるため、修正や変更が容易になる
  • 共通部分を一元管理できるため、メンテナンス性が向上する
  • テンプレートの構造が明確になり、可読性が向上する
  • 開発効率が向上し、開発スピードが速くなる

特にWebアプリケーション開発では、ページ数が増えるほどテンプレートの再利用が重要になります。

Go言語テンプレート再利用時の注意点

テンプレートを再利用する際には、以下の点に注意しましょう。

  • テンプレート名(defineで定義する名前)は重複しないように注意する
  • テンプレートファイルの読み込み順序に注意する(依存関係がある場合は、依存元を先に読み込む)
  • データ構造を統一し、テンプレートに渡すデータを明確にする
  • HTMLを扱う場合は必ずhtml/templateを使い、XSS攻撃を防ぐ

これらの注意点を守ることで、安全かつ効率的にテンプレートを再利用できます。

あとがき

今回はGo言語のテンプレート機能を再利用する方法について初心者向けに解説しました。テンプレートの再利用は、コードの重複を避け、メンテナンス性を向上させるために非常に重要なテクニックです。ぜひ実際の開発で活用して、効率的で安全なWebアプリケーション開発を目指しましょう。


スポンサーリンク

共有

もふもふ

プロフィール

著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア