Maison > développement back-end > Golang > Comment puis-je transmettre plusieurs valeurs entre les modèles Go ?

Comment puis-je transmettre plusieurs valeurs entre les modèles Go ?

Patricia Arquette
Libérer: 2024-12-04 14:28:12
original
240 Les gens l'ont consulté

How Can I Pass Multiple Values Between Go Templates?

Transmission de plusieurs valeurs entre modèles

Lorsque vous travaillez avec des structures de données complexes impliquant plusieurs types imbriqués, transmettre plusieurs valeurs d'un modèle à un autre devient un défi. Explorons un scénario dans lequel nous avons ces structures :

  • Structure City : contient des propriétés telles que l'ID, le nom et une tranche de structures Region.
  • Structure Region : contient l'ID, le nom, et diverses autres tranches représentant différents types de données.

Dans notre fonction principale, nous essayons d'exécuter un modèle avec CityWithSomeData, qui est un tableau de structures City :

tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)
Copier après la connexion

Transmission de plusieurs valeurs dans les modèles

Malheureusement, il n'est pas possible de transmettre plusieurs valeurs directement dans les modèles à l'aide de l'option Syntaxe {{.}}. Selon la documentation texte/modèle, la syntaxe de l'action {{template}} permet de transmettre une seule valeur de données facultative.

{{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.
Copier après la connexion

Encapsulation des données dans une valeur unique

Pour surmonter cette limitation, nous devons regrouper nos multiples valeurs de données en une seule valeur qui peut être transmise en entrée au modèle. Cependant, comme nous ne pouvons pas écrire de code Go dans les modèles, nous allons créer une fonction wrapper personnalisée :

func Wrap(shops []Destination, cityName, regionName string) map[string]interface{} {
    return map[string]interface{}{
        "Shops":      shops,
        "CityName":   cityName,
        "RegionName": regionName,
    }
}
Copier après la connexion

Cette fonction Wrap() prend un tableau de valeurs de destination, ainsi que les noms de villes et de régions, et renvoie une carte qui combine toutes ces données. Maintenant, nous pouvons utiliser cette fonction dans notre modèle :

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}}`
Copier après la connexion

Exemple mis à jour

Voici un exemple mis à jour qui montre comment la fonction wrapper est utilisée :

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)
}
Copier après la connexion

Sortie

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}]
Copier après la connexion

Par emballage plusieurs valeurs de données dans une seule carte à l'aide de la fonction Wrap(), nous les avons transmises avec succès entre les modèles dans notre application Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal