首页 > 后端开发 > Golang > 如何将多个值从 Go 模板传递到嵌套模板?

如何将多个值从 Go 模板传递到嵌套模板?

Barbara Streisand
发布: 2024-12-06 14:53:10
原创
479 人浏览过

How can I pass multiple values from a Go template to a nested template?

将多个值从模板传递到模板

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板