使用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” 加上所有结构体中的名字。 我不确定哪里做错了。 补充说明:我没有使用 parseGlobparseFiles,因为我打算稍后将模板保存到数据库中。


更多关于使用Golang解析结构体切片中的模板的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

传递给 Execute() 的参数在模板中变为 .,因此你需要:

{{range .}}
    {{.Msg}}
{{end}}

(https://play.golang.org/p/Kn1YyQN_9cS)

更多关于使用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

主要问题:

  1. 模板中不需要 .datas,因为直接传入了切片
  2. range 语句需要正确的结束标记 {{end}}
  3. range 循环内部使用 {{.Msg}} 访问当前迭代的结构体字段
回到顶部