Edited at

Golangのテンプレート(Template)を使ってみる

More than 1 year has passed since last update.

Golang標準で使えるTemplateを使ってみます。

Templateを使用するとプログラムとデザインを分離することができます。

では、実際にやってみましょう。

下記のようにプログラム(server.go)とテンプレート(clock.tpl)を用意します。


server.go

package main

import (
"fmt"
"html/template"
"log"
"net/http"
"time"
)

func main() {
// /now にアクセスした際に処理するハンドラーを登録
http.HandleFunc("/now", handleClockTpl)

// サーバーをポート8080で起動
log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleClockTpl(w http.ResponseWriter, r *http.Request) {
// テンプレートをパース
tpl := template.Must(template.ParseFiles("clock.tpl"))

m := map[string]string{
"Date": time.Now().Format("2006-01-02"),
"Time": time.Now().Format("15:04:05"),
}

// テンプレートを描画
tpl.Execute(w, m)
}



clock.tpl

<!DOCTYPE html>

<html><body>
<p>Date={{.Date}}</p>
<p>Time={{.Time}}</p>
</body></html>

そして実行して、アクセスするとこんな感じです。

テンプレートテスト.png

{{.date}}{{.time}} がmapの要素に置き換わっているのが分かると思います。

ちなみに下記のようにmapではなく、構造体も使えます。


server.go(構造体の例

package main

import (
"fmt"
"html/template"
"log"
"net/http"
"time"
)

func main() {
// /now にアクセスした際に処理するハンドラーを登録
http.HandleFunc("/now", handleClockTpl)

// サーバーをポート8080で起動
log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleClockTpl(w http.ResponseWriter, r *http.Request) {
// テンプレートをパース
tpl := template.Must(template.ParseFiles("clock.tpl"))

type DateTime struct {
Date string
Time string
}

now := DateTime{Date: time.Now().Format("2006-01-02"), Time: time.Now().Format("15:04:05")}

// テンプレートを描画
tpl.Execute(w, now)
}


やはりデザイン部分は別ファイルにしたほうが、プログラムが見やすく、管理もしやすくなります。

数行のプログラムだとピンとこないかもしれませんが(笑)

それと、標準のTemplateでは対応していない、テンプレートファイルから別のテンプレートファイルをインクルードするような使い方をしたかったので、ちょっと独自にテンプレートエンジンを作ってみました。

興味のある方は下記からどうぞ。

Golangのインクルード(include)対応テンプレート(goingtpl)を作ってみた