处理涉及多个嵌套类型的复杂数据结构时,将多个值从一个模板传递到另一个模板成为一项挑战。让我们探讨一个具有以下结构的场景:
在我们的 main 函数中,我们尝试使用以下命令执行模板CityWithSomeData,它是 City 结构的数组:
tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)
在模板中传递多个值
不幸的是,无法使用{{.}} 语法。根据文本/模板文档,{{template}} 操作的语法仅允许传递一个可选数据值。
{{template "name"}} The template with the specified name is executed with nil data. {{template "name" pipeline}} The template with the specified name is executed with dot set to the value of the pipeline.
将数据包装在单个值中
为了克服这个限制,我们需要将多个数据值包装成一个可以作为输入传递到模板的值。但是,由于我们无法在模板中编写 Go 代码,因此我们将创建一个自定义包装函数:
func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} { return map[string]interface{}{ "Shops": shops, "CityName": cityName, "RegionName": regionName, } }
此 Wrap() 函数采用 Destination 值数组以及城市和地区名称,并返回一个结合了所有这些数据的地图。现在,我们可以在模板中使用此函数:
const src = ` {{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 := []City{ { Name: "CityA", Regions: []Region{ {Name: "CA-RA", Shops: []Destination{{"CA-RA-SA"}, {"CA-RA-SB"}}}, {Name: "CA-RB", Shops: []Destination{{"CA-RB-SA"}, {"CA-RB-SB"}}}, }, }, { Name: "CityB", Regions: []Region{ {Name: "CB-RA", Shops: []Destination{{"CB-RA-SA"}, {"CB-RA-SB"}}}, {Name: "CB-RB", Shops: []Destination{{"CB-RB-SA"}, {"CB-RB-SB"}}}, }, }, } if err := t.ExecuteTemplate(os.Stdout, "cities.gohtml", CityWithSomeData); err != nil { panic(err) }
输出
City: CityA, Region: CA-RA, Shops: [{CA-RA-SA} {CA-RA-SB}] City: CityA, Region: CA-RB, Shops: [{CA-RB-SA} {CA-RB-SB}] City: CityB, Region: CB-RA, Shops: [{CB-RA-SA} {CB-RA-SB}] City: CityB, Region: CB-RB, Shops: [{CB-RB-SA} {CB-RB-SB}]
通过使用 Wrap() 函数将多个数据值包装到单个映射中,我们成功地将它们在模板之间传递我们的 Go 应用程序。
以上是如何在 Go 模板之间传递多个值?的详细内容。更多信息请关注PHP中文网其他相关文章!