Heim > Backend-Entwicklung > Golang > Wie kann ich mehrere Werte zwischen Go-Vorlagen übergeben?

Wie kann ich mehrere Werte zwischen Go-Vorlagen übergeben?

Patricia Arquette
Freigeben: 2024-12-04 14:28:12
Original
240 Leute haben es durchsucht

How Can I Pass Multiple Values Between Go Templates?

Übergabe mehrerer Werte zwischen Vorlagen

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:

  • Stadtstruktur: Enthält Eigenschaften wie ID, Name und einen Teil der Regionsstrukturen.
  • Regionsstruktur: Enthält ID, Name, und verschiedene andere Slices, die unterschiedliche Datentypen darstellen.

In unserer Hauptfunktion versuchen wir, eine Vorlage mit CityWithSomeData auszuführen, einem Array von Stadtstrukturen:

tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)
Nach dem Login kopieren

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.
Nach dem Login kopieren

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,
    }
}
Nach dem Login kopieren

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}}`
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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}]
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage