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 :
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)
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.
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, } }
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}}`
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) }
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}]
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!