Heim >Backend-Entwicklung >Golang >Wie kann ich mehrere Werte von einer Go-Vorlage an eine verschachtelte Vorlage übergeben?

Wie kann ich mehrere Werte von einer Go-Vorlage an eine verschachtelte Vorlage übergeben?

Barbara Streisand
Barbara StreisandOriginal
2024-12-06 14:53:10549Durchsuche

How can I pass multiple values from a Go template to a nested template?

Mehrere Werte von Vorlage zu Vorlage übergeben

Beim Go-Templating ist es möglich, einen Datenwert an eine verschachtelte Vorlage zu übergeben, indem die {{ template}}-Aktion. Diese Aktion akzeptiert jedoch nur einen einzelnen Datenwert als Eingabe. Wenn mehrere Datenentitäten an eine verschachtelte Vorlage übergeben werden müssen, ist eine Lösung erforderlich.

Benutzerdefinierte Funktionen für die Datenverpackung

Das Vorlagensystem von Go ermöglicht die Registrierung benutzerdefinierter Funktionen mithilfe von Template.Funcs()-Methode. Diese Funktionen können Operationen an den Daten ausführen, bevor sie an die Vorlage übergeben werden, was eine Datenmanipulation und -paketierung ermöglicht.

Für den Fall, dass mehrere Werte an eine Vorlage übergeben werden müssen, kann eine benutzerdefinierte Funktion zum Umschließen erstellt werden diese Werte in eine einzige Entität, z. B. eine Karte oder Struktur. Diese verpackte Entität kann dann an die Aktion {{template}} übergeben werden.

Vorlagenänderung

Sobald die benutzerdefinierte Funktion definiert ist, kann die Vorlage zum Aufrufen geändert werden Führen Sie diese Funktion aus und übergeben Sie die umschlossene Datenentität an die verschachtelte Vorlage. Die Syntax hierfür lautet:

{{template "templateName" (customFunctionName data1 data2)}}

Beispiel

Berücksichtigen Sie die folgenden Stadt- und Regionsstrukturen:

type City struct {
    ID      int
    Name    string
    Regions []Region
}  

type Region struct {
    ID               int
    Name             string
    Shops            []Destination
    Masters          []Master
    EducationCenters []Destination
}

Um mehrere Datenentitäten zu übergeben Für eine verschachtelte Vorlage kann eine benutzerdefinierte Funktion Wrap() wie folgt definiert werden:

func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} {
    return map[string]interface{}{
        "Shops":      shops,
        "CityName":   cityName,
        "RegionName": regionName,
    }
}

Diese Funktion umschließt Die Geschäfte ordnen die Namen von Städten und Regionen auf einer Karte an. Die geänderte Vorlage würde nun so aussehen:

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}}`

Ausführbares Beispiel

Der folgende Code zeigt, wie diese Lösung in der Praxis eingesetzt werden kann:

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}}`

Dieser Code demonstriert die erfolgreiche Übergabe mehrerer Datenentitäten an eine verschachtelte Vorlage mithilfe einer benutzerdefinierten Funktion.

Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Werte von einer Go-Vorlage an eine verschachtelte Vorlage ü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