kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

golangのechoのhtml/templateを使ってみる

golangでhtml/templateを使用したHTML表示を作成したので、理解したことを整理するために書いてみます。

フレームワークとしてechoを使用しています。

テンプレートファイル

読み込みを行うファイルを指定するので、ファイルの拡張子に決まりはないです。

tpl」や「html」で大丈夫です。

ファイルリストの読み込み指定

    list, err := template.New("t").ParseGlob("template/*.tpl")
    t := &Template{
        templates: template.Must(list, err),
    }

Template構造体の宣言

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

echo にテンプレート情報を設定

e := echo.New()
e.Renderer = t

goのソースから呼び出す際にがRendar関数で呼び出します。第二引数でテンプレートを指定し、第三引数で使用するパラメータを渡します。構造体も使用できます。

func Hello(c echo.Context) error {
    return c.Render(http.StatusOK, "xxx", "aaa")
}

テンプレートファイルにはdefineとend構文でそれぞれ定義をしていきます。

{{define "xxx"  }}
    <html>
    <head></head>
    <body>{{.}}</body>
    </html>
{{end}}

表示だけならこれでできます。

テンプレートフォルダを分ける

規模が大きくなるとファイル数が増えていき、可読性が下がるので、ディレクトリを複数指定できるようにしました。

探してみましたが、ディレクトリの指定が一つの場合が多く、複数指定の記事がなかったですね。

qiita.com

テンプレートファイルからテンプレートを呼び出す場合には、template文を使用します。引数を指定することが可能です。

{{define "name"}}
    {{.}}さん
{{end}}

{{template "name" .Name}}

関数呼び出し

定義を作成し、templateに設定しておきます。

   funcMap := template.FuncMap{
      "name" : func(v string) string {
           return v  + "さん"
      },
     "nl2br": func(text string) template.HTML {
      return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br />", -1))
     },
   }

    list, err := template.New("t").Funcs(funcMap).ParseGlob("template/*.tpl")

テンプレートファイルからは、設定した関数名を呼び出すだけです。

{{nl2br .Memo}}

注意事項として、関数名を間違えると面倒でした。

qiita.com

Golandでのgoテンプレート補完

JetBrainsのGolandで開発を行なっていますが、templateのコード補完で調べても出てこないので、書いておきます。

pleiades.io

以前一度見つけてから、再度見つけるのに時間がかかってしまったので、メモです。

参考

html/templateで困った際に参考にさせてもらったサイト

マニュアル

golang.org

かなり理解できるようになりました。

medium.com

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発