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

Comment transmettre efficacement plusieurs valeurs entre les modèles Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-09 14:09:16301parcourir

How to Efficiently Pass Multiple Values Between Go Templates?

Passer plusieurs valeurs d'un modèle à l'autre dans Go : un guide complet

Comment puis-je transférer efficacement plusieurs valeurs d'un modèle à un autre dans Aller? Considérez le contexte fourni :

  • Structure de la ville : {ID int, Name string, Regions []Region}
  • Region struct : {ID int, Name string, Shops []Destination, Masters []Master, EducationCenters []Destination}

Dans la fonction principale, j'exécute un modèle villes.gohtml avec un CityWithSomeData :

tpl.ExecuteTemplate(resWriter, "cities.gohtml", CityWithSomeData)

Dans le modèle, mon objectif est de parcourir les villes et les régions pour transmettre des données à un autre modèle de données :

{{range .}}
        {{$city:=.Name}}
            {{range .Regions}}
                      {{$region:=.Name}}
                      {{template "data" .Shops $city $region}}
            {{end}}
{{end}}

Solution

Selon la documentation du modèle Go, la syntaxe de l'action {{template}} permet de transmettre une seule valeur de données facultative. Pour transmettre plusieurs valeurs, nous devons d'abord les encapsuler dans une seule valeur, telle qu'une carte ou une structure.

Comme il n'est pas possible d'écrire du code Go dans un modèle, nous pouvons enregistrer une fonction personnalisée pour effectuer cela. tâche :

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

Les fonctions personnalisées sont enregistrées à l'aide de Template.Funcs(). Ensuite, nous modifions le modèle pour appeler la fonction Wrap() :

{{define "data"}}
    City: {{.CityName}}, Region: {{.RegionName}}, Shops: {{.Shops}}
{{end}}
{{- range . -}}
        {{$city:=.Name}}
        {{- range .Regions -}}
              {{$region:=.Name}}
              {{- template "data" (Wrap .Shops $city $region) -}}
        {{end}}
{{- end}}

Enfin, un exemple de code démontrant ces concepts :

t := template.Must(template.New("cities.gohtml").Funcs(template.FuncMap{
    "Wrap": Wrap,
}).Parse(src))
CityWithSomeData = [...cities]
if err := t.ExecuteTemplate(os.Stdout, "cities.gohtml", CityWithSomeData); err != nil {
    panic(err)
}

Cette approche permet le passage efficace de plusieurs valeurs d'un modèle à un autre dans 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!

Déclaration:
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