go 语言模板遍历语法及模板变量定义

go 语言模板遍历语法

html 语法:

{{range $key 或 索引, $遍历元素}}
    HTML 循环元素
{{end}}

go 示例

package main

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

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		template, _ := template.ParseFiles("./templates/index.html")
		// 注册多个数据
		var data = map[string]any{
			"name": "lesscode.work",
			"persons": []string{
				"小张", "小王", "小李",
			},
		}
		template.Execute(w, data)

	})
	http.ListenAndServe(":80", nil)
}

html 模板文件示例

<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
    <ul>
        {{range $idx, $item := .persons}}
        <li>{{$idx}} : {{$item}}</li>
        {{end}}
    </ul>
</body>
</html>

变量传递解决方案

在上面的示例中我们注册了 2个变量 : name 和 persons ,然后我们在 HTML 模板中对 persons 变量进行遍历,在遍历过程中如果我们需要直接使用 name 变量是无法做到的,如 :

<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
    <ul>
        {{range $idx, $item := .persons}}
        <li>{{$idx}} : {{$item}} - {{.name}}</li>
        {{end}}
    </ul>
</body>
</html>

原因是 : . ( 英文点 ) 的作用域在遍历过程中被重置,如何解决呢?

定义一个模板变量

定义一个模板变量可以有效解决上面的变量作用域问题,模板变量定于语法 :

{{$变量名称 := .原变量名称}}

示例 :

<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
    <ul>
        {{$name := .name}}
        {{range $idx, $item := .persons}}
        <li>{{$idx}} : {{$item}} - {{$name}}</li>
        {{end}}
    </ul>
</body>
</html>