Golang の HTML テンプレート内で If-Else と Switch ループを使用する

Jay Singh 2023年6月20日
  1. Golang の HTML テンプレート内で if-else ループを使用する
  2. Golang で HTML テンプレート内の switch ループを使用する
Golang の HTML テンプレート内で If-Else と Switch ループを使用する

HTML テンプレートは、コード インジェクションに対して安全な HTML 出力を作成するためのデータ駆動型テンプレートをサポートする Golang (Go) パッケージです。 HTML/テンプレートを利用する重要な利点の 1つは、文脈に応じた自動エスケープを使用して安全なエスケープ HTML 出力を生成することです。

結果として、出力が HTML の場合は常に、テキスト テンプレートの代わりに HTML テンプレート パッケージを使用する必要があります。 HTML テンプレートで if-elseswitch を使用する例をいくつか見てみましょう。

Golang の HTML テンプレート内で if-else ループを使用する

この例では、ToDo リスト項目からのデータを保持する 2つの構造体を作成します: ToDoPageData。 定義された 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}} &#10004</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: