Golang の HTML テンプレート内で If-Else と Switch ループを使用する
Jay Singh
2023年6月20日
HTML テンプレートは、コード インジェクションに対して安全な HTML 出力を作成するためのデータ駆動型テンプレートをサポートする Golang (Go) パッケージです。 HTML/テンプレートを利用する重要な利点の 1つは、文脈に応じた自動エスケープを使用して安全なエスケープ HTML 出力を生成することです。
結果として、出力が HTML の場合は常に、テキスト テンプレートの代わりに HTML テンプレート パッケージを使用する必要があります。 HTML テンプレートで if-else
と switch
を使用する例をいくつか見てみましょう。
Golang の HTML テンプレート内で if-else
ループを使用する
この例では、ToDo
リスト項目からのデータを保持する 2つの構造体を作成します: ToDo
と PageData
。 定義された HTML テンプレート tmpl
が作成され、解析されます。
最後に、HTML を Execute()
関数、データ、および解析済み HTML テンプレートに渡してレンダリングします。
コード:
package main
import (
"html/template"
"log"
"os"
)
type Todo struct {
Title string
Done bool
}
type PageData struct {
PageTitle string
Todos []Todo
}
func main() {
const tmpl = `
<h1>{{.PageTitle}}</h1>
<ul>
{{range .Todos}}
{{if .Done}}
<li>{{.Title}} ✔</li>
{{else}}
<li>{{.Title}}</li>
{{end}}
{{end}}
</ul>`
t, err := template.New("webpage").Parse(tmpl)
if err != nil {
log.Fatal(err)
}
data := PageData{
PageTitle: "Personal TODO list",
Todos: []Todo{
{Title: "Task 1", Done: true},
{Title: "Task 2", Done: false},
{Title: "Task 3", Done: false},
},
}
t.Execute(os.Stdout, data)
}
出力:
Personal TODO list
Task 1 ✔
Task 2
Task 3
Golang で HTML テンプレート内の switch
ループを使用する
コード:
package main
import (
"fmt"
"html/template"
"os"
)
func main() {
const (
paragraph_hypothesis = 1 << iota
paragraph_attachment = 1 << iota
paragraph_menu = 1 << iota
)
const text = "{{.Paratype | printpara}}\n"
type Paragraph struct {
Paratype int
}
var paralist = []*Paragraph{
&Paragraph{paragraph_hypothesis},
&Paragraph{paragraph_attachment},
&Paragraph{paragraph_menu},
}
t := template.New("testparagraphs")
printPara := func(paratype int) string {
text := ""
switch paratype {
case paragraph_hypothesis:
text = "This is a hypothesis testing\n"
case paragraph_attachment:
text = "This is using switch case\n"
case paragraph_menu:
text = "Menu\n1:\n2:\n3:\n\nPick any option:\n"
}
return text
}
template.Must(t.Funcs(template.FuncMap{"printpara": printPara}).Parse(text))
for _, p := range paralist {
err := t.Execute(os.Stdout, p)
if err != nil {
fmt.Println("executing template:", err)
}
}
}
出力:
This is a hypothesis testing
This is using switch case
Menu
1:
2:
3:
Pick any option: