ZBLOG

golang 模板使用 range

在 Go 语言中,range 关键字不仅可以在 for 循环中使用,还可以在 HTML/文本模板(html/templatetext/template 中进行数据遍历。以下是详细的使用方法:


1. 基本语法

Go 的模板引擎支持类似 Go 语言的 range 语法:

  1. {{ range $index, $element := .Collection }}
  2. {{ $index }}: {{ $element }}
  3. {{ end }}
  • $index:当前元素的索引(可选)。
  • $element:当前元素的值。
  • .Collection:传入模板的数据集合(如 slice、array、map)。

2. 不同数据类型的 range 用法

(1) 遍历 Slice/Array

示例代码:

  1. package main
  2. import (
  3. "os"
  4. "text/template"
  5. )
  6. func main() {
  7. data := []string{"Go", "Python", "Java"}
  8. tmpl := `
  9. {{ range $i, $lang := . }}
  10. {{ $i }}: {{ $lang }}
  11. {{ end }}`
  12. t := template.Must(template.New("").Parse(tmpl))
  13. t.Execute(os.Stdout, data)
  14. }

输出:

  1. 0: Go
  2. 1: Python
  3. 2: Java

(2) 遍历 Map

示例代码:

  1. data := map[string]int{"Alice":25, "Bob":30}
  2. tmpl := `
  3. {{ range $name, $age := . }}
  4. {{ $name }} is {{ $age }} years old.
  5. {{ end }}`
  6. t.Execute(os.Stdout, data)

输出(顺序随机):

  1. Alice is 25 years old.
  2. Bob is 30 years old.

(3) 嵌套遍历(Slice of Structs)

示例代码:

  1. type User struct {
  2. Name string
  3. Age int
  4. }
  5. users := []User{
  6. {"Alice",25},
  7. {"Bob",30},
  8. }
  9. tmpl := `
  10. {{ range . }}
  11. Name: {{ .Name }}, Age: {{ .Age }}
  12. {{ end }}`

输出:

  1. Name: Alice, Age:25
  2. Name: Bob, Age:30

3. ⚠️注意事项

场景 说明
空集合处理 range不会报错,但无输出。可用 if len(.Collection) >0检查。
作用域变化 range内部的作用域会改变,.指向当前元素(如结构体字段用.FieldName访问)。
HTML转义安全 html/template会自动转义内容防止XSS攻击,纯文本用text/template

4. 高级用法

(1) Else分支(空集合时显示默认内容)

  1. {{ range .Users }}
  2. {{ .Name }}
  3. {{ else }}
  4. No users found!
  5. {{ end }}

(2) Pipeline操作(结合函数)

  1. //假设有自定义函数 toUpper
  2. funcMap := template.FuncMap{"toUpper": strings.ToUpper}
  3. t.Funcs(funcMap)
  4. tmpl := `
  5. {{ range .Names }}
  6. {{ . | toUpper}}
  7. {{ end }}`

5. HTML模板示例(Web应用常用)

  1. <!-- templates/users.html -->
  2. <ul>
  3. {{ range .Users }}
  4. <li>{{ .Name }} (Age: {{ .Age }})</li>
  5. {{ end }}
  6. </ul>

渲染代码:

  1. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
  2. tmpl := template.Must(template.ParseFiles("templates/users.html"))
  3. data:= struct{ Users []User }{users}
  4. tmpl.Execute(w, data)
  5. })

通过灵活使用模板中的 range,可以高效生成动态内容!


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?