Goのtemplateの"."アクションを使ってみる

October 05, 2022

確認環境

$ go version
go version go1.15.5 darwin/amd64

ファイルの準備

ファイルの全体像

$ tree
.
├── main.go
└── templates
    ├── home.tmpl
    └── layout.tmpl

1 directory, 3 files

main.go

package main

import (
	"fmt"
	"net/http"
	"text/template"
)

func Home(w http.ResponseWriter, r *http.Request) {
	parsedTemplate, _ := template.ParseFiles("./templates/home.tmpl", "./templates/layout.tmpl")
	intArray := []int{1, 20, 3, 40}
	err := parsedTemplate.Execute(w, intArray)
	if err != nil {
		fmt.Println("Error:", err)
	}
}
func main() {
		http.HandleFunc("/", Home)
		_ = http.ListenAndServe(":8081", nil)
}

sample/templates/home.tmpl

{{ template "layout" . }}

{{ define "content" }}
  Home page
  <ul>
    {{ range . }}
      <li>{{ . }}</li>
    {{ end }}
  </ul>
{{ end }}

sample/templates/layout.tmpl

{{ define "layout" }}
<html>
  <body>
    <p>content</p>
    {{ block "content" .}}
    {{ end }}
    <p>in layout</p>
    <ul>
      {{ range . }}
        <li>{{ . }}</li>
      {{ end }}
    </ul>
  </body>
</html>
{{ end }}

ブラウザにアクセス

サーバー起動

$ go run main.go

生成されてる html の確認

$ curl localhost:8081

<html>
  <body>
    <p>content</p>

  Home page
  <ul>

      <li>1</li>

      <li>20</li>

      <li>3</li>

      <li>40</li>

  </ul>

    <p>in layout</p>
    <ul>

        <li>1</li>

        <li>20</li>

        <li>3</li>

        <li>40</li>

    </ul>
  </body>
</html>

感想

初見だと、range ブロックの . と、変数をアサインしてる . の区別が難しいと思いました。

参考


SHARE

Profile picture

Written by tamesuu