読者です 読者をやめる 読者になる 読者になる

【Go】Echoでのテンプレート(html/template)の使い方メモ

Go Echo

はじめに

Echoでテンプレートの使い方を調べたのでメモ。

今回やりたかったことはそんな多くなくて
・URLによってテンプレートを振り分けたい
・ヘッダー等の共通テンプレートを使いまわしたい

実装

まずはメインの処理

server.go

package main

import(
  "net/http"
  "html/template"

  "github.com/labstack/echo"
)

type Template struct {
  templates *template.Template
}

func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
  return t.templates.ExecuteTemplate(w, name, data)
}

// サイトで共通情報
type ServiceInfo struct {
  Title string
}

var serviceInfo = ServiceInfo {
  "サイトのタイトル",
}

func main() {

  t := &Template{
    templates: template.Must(template.ParseGlob("views/*.html")),
  }

  e := echo.New()

  e.Renderer = t

  e.GET("/page1", func(c echo.Context) error {
    // テンプレートに渡す値
    data := struct {
      ServiceInfo
      Content string
    } {
      ServiceInfo: serviceInfo,
      Content: "ページのコンテンツ",
    }
    return c.Render(http.StatusOK, "page1", data)
  })

  e.Logger.Fatal(e.Start(":1323"))
}

次はテンプレート。
header.htmlが各ページからよばれる共通テンプレート。
defineでテンプレート名をきめる

views/header.html

{{define "header"}}
  <h1>{{.ServiceInfo.Title}}</h1>
{{end}}

page1.htmlからheader.htmlを呼び出してる。
templateでdefineで定義したテンプレートを呼び出す

{{template "header" .}}の1番後ろの「.」で変数を渡している

view/page1.html

{{define "page1"}}
  {{template "header" .}}
  <div>{{.Content}}</div>
{{end}}

まとまりないけど以上です