在 Go 语言中,range
关键字不仅可以在 for
循环中使用,还可以在 HTML/文本模板(html/template
或 text/template
) 中进行数据遍历。以下是详细的使用方法:
1. 基本语法
Go 的模板引擎支持类似 Go 语言的 range
语法:
{{ range $index, $element := .Collection }}
{{ $index }}: {{ $element }}
{{ end }}
$index
:当前元素的索引(可选)。$element
:当前元素的值。.Collection
:传入模板的数据集合(如 slice、array、map)。
2. 不同数据类型的 range
用法
(1) 遍历 Slice/Array
示例代码:
package main
import (
"os"
"text/template"
)
func main() {
data := []string{"Go", "Python", "Java"}
tmpl := `
{{ range $i, $lang := . }}
{{ $i }}: {{ $lang }}
{{ end }}`
t := template.Must(template.New("").Parse(tmpl))
t.Execute(os.Stdout, data)
}
输出:
0: Go
1: Python
2: Java
(2) 遍历 Map
示例代码:
data := map[string]int{"Alice":25, "Bob":30}
tmpl := `
{{ range $name, $age := . }}
{{ $name }} is {{ $age }} years old.
{{ end }}`
t.Execute(os.Stdout, data)
输出(顺序随机):
Alice is 25 years old.
Bob is 30 years old.
(3) 嵌套遍历(Slice of Structs)
示例代码:
type User struct {
Name string
Age int
}
users := []User{
{"Alice",25},
{"Bob",30},
}
tmpl := `
{{ range . }}
Name: {{ .Name }}, Age: {{ .Age }}
{{ end }}`
输出:
Name: Alice, Age:25
Name: Bob, Age:30
3. ⚠️注意事项
场景 | 说明 |
---|---|
空集合处理 | range 不会报错,但无输出。可用 if len(.Collection) >0 检查。 |
作用域变化 | range 内部的作用域会改变,. 指向当前元素(如结构体字段用.FieldName 访问)。 |
HTML转义安全 | html/template 会自动转义内容防止XSS攻击,纯文本用text/template 。 |
4. 高级用法
(1) Else分支(空集合时显示默认内容)
{{ range .Users }}
{{ .Name }}
{{ else }}
No users found!
{{ end }}
(2) Pipeline操作(结合函数)
//假设有自定义函数 toUpper
funcMap := template.FuncMap{"toUpper": strings.ToUpper}
t.Funcs(funcMap)
tmpl := `
{{ range .Names }}
{{ . | toUpper}}
{{ end }}`
5. HTML模板示例(Web应用常用)
<!-- templates/users.html -->
<ul>
{{ range .Users }}
<li>{{ .Name }} (Age: {{ .Age }})</li>
{{ end }}
</ul>
渲染代码:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
tmpl := template.Must(template.ParseFiles("templates/users.html"))
data:= struct{ Users []User }{users}
tmpl.Execute(w, data)
})
通过灵活使用模板中的 range
,可以高效生成动态内容!
内容由零声教学AI助手提供,问题来源于学员提问