ZBLOG

golang 模板使用 range

在 Go 语言中,range 关键字不仅可以在 for 循环中使用,还可以在 HTML/文本模板(html/templatetext/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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23768

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?