在 Go 中将多个值从一个模板传递到另一个模板:综合指南
如何熟练地将多个值从一个模板传递到另一个模板去?考虑提供的上下文:
在 main 函数中,我执行了带有 CityWithSomeData 的模板 citys.gohtml:
tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)
在模板中,我的目标是迭代城市和地区以将数据传递到另一个模板数据:
{{range .}} {{$city:=.Name}} {{range .Regions}} {{$region:=.Name}} {{template "data" .Shops $city $region}} {{end}} {{end}}
解决方案
根据 Go 模板文档, {{template}} 操作的语法允许传递只有一个可选数据值。要传递多个值,我们需要首先将它们封装成单个值,例如映射或结构体。
由于在模板中编写 Go 代码不可行,因此我们可以注册一个自定义函数来执行此操作任务:
func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} { return map[string]interface{}{ "Shops": shops, "CityName": cityName, "RegionName": regionName, } }
使用 Template.Funcs() 注册自定义函数。然后,我们修改模板以调用 Wrap() 函数:
{{define "data"}} City: {{.CityName}}, Region: {{.RegionName}}, Shops: {{.Shops}} {{end}} {{- range . -}} {{$city:=.Name}} {{- range .Regions -}} {{$region:=.Name}} {{- template "data" (Wrap .Shops $city $region) -}} {{end}} {{- end}}
最后,演示这些概念的示例代码:
t := template.Must(template.New("cities.gohtml").Funcs(template.FuncMap{ "Wrap": Wrap, }).Parse(src)) CityWithSomeData = [...cities] if err := t.ExecuteTemplate(os.Stdout, "cities.gohtml", CityWithSomeData); err != nil { panic(err) }
这种方法允许高效传递多个值在 Go 中从一个模板到另一个模板。
以上是如何在 Go 模板之间高效传递多个值?的详细内容。更多信息请关注PHP中文网其他相关文章!