複数のネストされた型を含む複雑なデータ構造を扱う場合、あるテンプレートから別のテンプレートに複数の値を渡すことが困難になります。次の構造体があるシナリオを検討してみましょう。
メイン関数では、テンプレートを実行しようとします。 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 サイトの他の関連記事を参照してください。