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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 14:53:10468ブラウズ

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

テンプレートからテンプレートへ複数の値を渡す

Go テンプレートでは、{{ を使用して、ネストされたテンプレートにデータ値を渡すことができます。テンプレート}} アクション。ただし、このアクションは単一のデータ値のみを入力として受け入れます。複数のデータ エンティティをネストされたテンプレートに渡す必要がある場合、解決策が必要です。

データ パッケージ化のためのカスタム関数

Go のテンプレート システムでは、 Template.Funcs() メソッド。これらの関数は、データがテンプレートに渡される前にデータに対して操作を実行できるため、データの操作とパッケージ化が可能になります。

複数の値をテンプレートに渡す必要がある場合は、ラップするカスタム関数を作成できます。これらの値をマップや構造体などの単一のエンティティにまとめます。このラップされたエンティティは、{{template}} アクションに渡すことができます。

テンプレートの変更

カスタム関数を定義したら、テンプレートを変更して呼び出すことができます。この関数を使用して、ラップされたデータ エンティティをネストされたテンプレートに渡します。この構文は次のとおりです。

{{template "templateName" (customFunctionName data1 data2)}}

次の City および Regional 構造体を考えてみましょう。

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 中国語 Web サイトの他の関連記事を参照してください。

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