網頁

2023/10/11

Golang template range用法

Golang text/template使用range語法遍歷集合資料物件。


範例環境:

  • Go 1.19


事前要求

參考「Golang template 模板簡單範例」了解template基本用法。


使用range

當模板中的某些部分需要逐一呈現集合資料物件中的元素,則使用{{range pipeline}} T1 {{end}}pipeline是要遍歷的陣列資料集合物件,例如array、slice、map或channel;T1是range內的template。

例如下面將模板demo中range部分以slice []Employee中的元素來替換。

main.go

package main

import (
    "os"
    "text/template"
)

type Employee struct {
    Name string
    Age  int
}

func main() {
    text := `Employees:
{{range .}}    Name:{{.Name}}, Age:{{.Age}}
{{end}}`
    t := template.Must(template.New("demo").Parse(text)) // 解析模板內容來建立名稱為'demo'的模板

    data := []Employee{
        {"John", 33},
        {"Mary", 28},
    }
    err := t.Execute(os.Stdout, data) // 將資料物件套用在模板,並將結果輸出到標準輸出
    if err != nil {
        panic(err)
    }

}

github



測試

執行程式輸出結果如下:

Employees:
    Name:John, Age:33
    Name:Mary, Age:28


使用index

使用{{range $index, $element := pipeline}}可取得索引值和陣列中的個別元素。

main.go

package main

import (
    "html/template"
    "os"
)

type Employee struct {
    Name string
    Age  int
}

func main() {
    text := `Employees:
{{range $i, $e := .}}    {{$i}} - Name:{{$e.Name}}, Age:{{$e.Age}}
{{end}}`

    t := template.Must(template.New("demo").Parse(text))
    data := []Employee{
        {"John", 33},
        {"Mary", 28},
    }
    err := t.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }
}

測試

執行程式輸出結果如下:

Employees:
    0 - Name:John, Age:33
    1 - Name:Mary, Age:28


取得特定索引位置元素

例如使用{{index pipeline 0}}可取得第一個索引的元素。

main.go

package main

import (
    "html/template"
    "os"
)

type Employee struct {
    Name string
    Age  int
}

func main() {
    text := `Employee: Name:{{(index . 0).Name}}`

    t := template.Must(template.New("demo").Parse(text))
    data := []Employee{
        {"John", 33},
        {"Mary", 28},
    }
    err := t.Execute(os.Stdout, data)
    if err != nil {
        panic(err)
    }
}

測試

執行程式輸出結果如下:

Employee: Name:John


沒有留言:

張貼留言