ホームページ >バックエンド開発 >Golang >Go テンプレート間で複数の値を渡すにはどうすればよいですか?

Go テンプレート間で複数の値を渡すにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-04 14:28:12305ブラウズ

How Can I Pass Multiple Values Between Go Templates?

テンプレート間での複数の値の受け渡し

複数のネストされた型を含む複雑なデータ構造を扱う場合、あるテンプレートから別のテンプレートに複数の値を渡すことが困難になります。次の構造体があるシナリオを検討してみましょう。

  • City 構造体: ID、名前、地域構造体のスライスなどのプロパティが含まれています。
  • 地域構造体: ID、名前、

メイン関数では、テンプレートを実行しようとします。 City 構造体の配列である CityWithSomeData を使用します。

tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)

テンプレートで複数の値を渡す

残念ながら、次を使用してテンプレートに複数の値を直接渡すことはできません。 {{.}} 構文。テキスト/テン​​プレートのドキュメントによると、{{template}} アクションの構文では、オプションのデータ値を 1 つだけ渡すことができます。

{{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.

データを単一の値にラップする

この制限を克服するには、複数のデータ値を、入力としてテンプレートに渡すことができる 1 つの値にラップする必要があります。ただし、テンプレートに 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() 関数を使用して複数のデータ値を 1 つのマップにラップすることで、それらをテンプレート間で渡すことができました。私たちの Go アプリケーション。

以上がGo テンプレート間で複数の値を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。