首页 >后端开发 >Golang >如何在 Go 模板之间传递多个值?

如何在 Go 模板之间传递多个值?

Patricia Arquette
Patricia Arquette原创
2024-12-04 14:28:12242浏览

How Can I Pass Multiple Values Between Go Templates?

在模板之间传递多个值

处理涉及多个嵌套类型的复杂数据结构时,将多个值从一个模板传递到另一个模板成为一项挑战。让我们探讨一个具有以下结构的场景:

  • City 结构:包含 ID、名称和 Region 结构切片等属性。
  • Region 结构:包含 ID、名称、以及代表不同数据类型的各种其他切片。

在我们的 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn