Golang의 HTML 템플릿 내부에서 If-Else 및 스위치 루프 사용

Jay Singh 2023년6월20일
  1. Golang의 HTML 템플릿 내부에서 if-else 루프 사용
  2. Golang에서 스위치 루프 내부 HTML 템플릿 사용
Golang의 HTML 템플릿 내부에서 If-Else 및 스위치 루프 사용

HTML 템플릿은 코드 삽입에 대해 안전한 HTML 출력을 생성하기 위한 데이터 기반 템플릿을 지원하는 Golang(Go) 패키지입니다. HTML/템플릿 활용의 중요한 이점 중 하나는 상황에 맞는 자동 이스케이프를 사용하여 안전하고 이스케이프된 HTML 출력을 생성한다는 것입니다.

결과적으로 출력이 HTML일 때마다 항상 텍스트 템플릿 대신 HTML 템플릿 패키지를 사용해야 합니다. HTML 템플릿에서 if-elseswitch를 사용하는 몇 가지 예를 살펴보겠습니다.

Golang의 HTML 템플릿 내부에서 if-else 루프 사용

이 예에서는 ToDo 목록 항목인 ToDoPageData의 데이터를 보유하는 두 개의 구조체를 생성합니다. 정의된 HTML 템플릿 tmpl이 생성되고 구문 분석됩니다.

마지막으로 Execute() 함수, 데이터 및 구문 분석된 HTML 템플릿에 HTML을 제공하여 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 템플릿 사용

암호:

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: