将多个值从模板传递到模板
在 Go 模板中,可以使用 {{模板}} 操作。但是,此操作仅接受单个数据值作为输入。当需要将多个数据实体传递给嵌套模板时,需要一个解决方案。
用于数据打包的自定义函数
Go 的模板系统允许使用以下方式注册自定义函数Template.Funcs() 方法。这些函数可以在数据传递到模板之前对数据进行操作,从而实现数据操作和打包。
在需要将多个值传递给模板的情况下,可以创建一个自定义函数来包装将这些值放入单个实体中,例如映射或结构。然后可以将此包装的实体传递给 {{template}} 操作。
模板修改
定义自定义函数后,可以修改模板以调用此函数并将包装的数据实体传递给嵌套模板。其语法为:
{{template "templateName" (customFunctionName data1 data2)}}
示例
考虑以下城市和地区结构:
type City struct { ID int Name string Regions []Region } type Region struct { ID int Name string Shops []Destination Masters []Master EducationCenters []Destination }
传递多个数据实体对于嵌套模板,自定义函数 Wrap() 可以定义为如下:
func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} { return map[string]interface{}{ "Shops": shops, "CityName": cityName, "RegionName": regionName, } }
此函数将商店数组以及城市和地区名称包装到地图中。修改后的模板现在如下所示:
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}}`
可运行示例
以下代码演示了如何在实践中使用此解决方案:
package main import ( "os" "text/template" ) type City struct { ID int Name string Regions []Region } type Region struct { ID int Name string Shops []Destination Masters []Master EducationCenters []Destination } type Destination struct { Name string } func main() { 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) } } 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}}`
此代码演示了如何使用自定义函数将多个数据实体成功传递到嵌套模板。
以上是如何将多个值从 Go 模板传递到嵌套模板?的详细内容。更多信息请关注PHP中文网其他相关文章!