Bei der Arbeit mit komplexen Datenstrukturen mit mehreren verschachtelten Typen wird die Übergabe mehrerer Werte von einer Vorlage an eine andere zu einer Herausforderung. Lassen Sie uns ein Szenario untersuchen, in dem wir diese Strukturen haben:
In unserer Hauptfunktion versuchen wir, eine Vorlage mit CityWithSomeData auszuführen, einem Array von Stadtstrukturen:
tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)
Mehrere Werte in Vorlagen übergeben
Leider ist es nicht möglich, mehrere Werte direkt in Vorlagen mit {{.}} zu übergeben. Syntax. Gemäß der Text-/Vorlagendokumentation erlaubt die Syntax für die Aktion {{template}} nur die Übergabe eines optionalen Datenwerts.
{{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.
Daten in einen einzelnen Wert einschließen
Um diese Einschränkung zu überwinden, müssen wir unsere mehreren Datenwerte in einen einzigen Wert zusammenfassen, der als Eingabe an die Vorlage übergeben werden kann. Da wir jedoch keinen Go-Code in Vorlagen schreiben können, erstellen wir eine benutzerdefinierte Wrapper-Funktion:
func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} { return map[string]interface{}{ "Shops": shops, "CityName": cityName, "RegionName": regionName, } }
Diese Wrap()-Funktion akzeptiert ein Array von Zielwerten sowie Stadt- und Regionsnamen. und gibt eine Karte zurück, die alle diese Daten kombiniert. Jetzt können wir diese Funktion in unserer Vorlage verwenden:
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}}`
Aktualisiertes Beispiel
Hier ist ein aktualisiertes Beispiel, das zeigt, wie die Wrapper-Funktion verwendet wird:
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) }
Ausgabe
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}]
Durch Umschließen mehrerer Daten Nachdem wir Werte mithilfe der Wrap()-Funktion in eine einzelne Karte umgewandelt haben, haben wir sie erfolgreich zwischen Vorlagen in unserer Go-Anwendung übergeben.
Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Werte zwischen Go-Vorlagen übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!