Templateを使ってみる

今回はGo標準で使える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>
    

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

go20170821_01.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)
    }
    
    

やはりデザイン部分は別ファイルにしたほうが、プログラムが見やすく、管理もしやすくなります。
数行のプログラムだとピンとこないかもしれませんが(笑)