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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-12-04 14:28:12341Durchsuche

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)

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!

Stellungnahme:
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