使用Golang解析结构体切片中的模板
使用Golang解析结构体切片中的模板 我有一个结构体切片,想用模板来解析它。
type Data struct {
ID int
Msg string
}
func main(){
justin := Data{ID: 1, Msg: "Justin", }
ruben := Data{ID: 2, Msg: "Ruben" }
petyaT := Data{ ID: 1, Msg: "Petya Tereodor Pidgallo"}
datas := []Data{justin, ruben, petyaT}
tpl, err := template.New("msgs").Parse(`Hello range .datas {{.Msg}}`)
if err != nil {
panic(err)
}
err = tpl.Execute(os.Stdout, datas)
if err != nil {
log.Fatalln(err)
}
}
预期的结果应该很简单——输出 “Hello” 加上所有结构体中的名字。
我不确定哪里做错了。
补充说明:我没有使用 parseGlob 或 parseFiles,因为我打算稍后将模板保存到数据库中。
更多关于使用Golang解析结构体切片中的模板的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
传递给 Execute() 的参数在模板中变为 .,因此你需要:
{{range .}}
{{.Msg}}
{{end}}
更多关于使用Golang解析结构体切片中的模板的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的模板语法有误。在Go模板中,range 操作需要正确的格式。以下是修正后的代码:
package main
import (
"os"
"text/template"
)
type Data struct {
ID int
Msg string
}
func main() {
justin := Data{ID: 1, Msg: "Justin"}
ruben := Data{ID: 2, Msg: "Ruben"}
petyaT := Data{ID: 3, Msg: "Petya Tereodor Pidgallo"}
datas := []Data{justin, ruben, petyaT}
// 修正模板语法
tpl, err := template.New("msgs").Parse(`Hello {{range .}}{{.Msg}} {{end}}`)
if err != nil {
panic(err)
}
err = tpl.Execute(os.Stdout, datas)
if err != nil {
panic(err)
}
}
输出结果:
Hello Justin Ruben Petya Tereodor Pidgallo
如果你想要更清晰的输出格式,可以这样修改模板:
// 每个名字单独一行
tpl, err := template.New("msgs").Parse(`Hello:
{{range .}}- {{.Msg}}
{{end}}`)
// 或者用逗号分隔
tpl, err := template.New("msgs").Parse(`Hello {{range $i, $v := .}}{{if $i}}, {{end}}{{.Msg}}{{end}}`)
第二个模板的输出会是:
Hello Justin, Ruben, Petya Tereodor Pidgallo
主要问题:
- 模板中不需要
.datas,因为直接传入了切片 range语句需要正确的结束标记{{end}}- 在
range循环内部使用{{.Msg}}访问当前迭代的结构体字段

