テンプレートからテンプレートへ複数の値を渡す
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 サイトの他の関連記事を参照してください。