Détection du dernier élément dans une plage de modèles
Dans les modèles Go, l'itération sur des tableaux ou des tranches à l'aide de l'action de plage permet un accès pratique à éléments du tableau. Cependant, il devient parfois nécessaire de distinguer la dernière itération des autres.
Considérons un modèle qui nécessite un formatage distinct pour le dernier élément d'une plage :
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
Ce modèle générerait une sortie comme :
one, two, three
Pour modifier ce comportement et afficher "et" avant le dernier élément :
one, two, and three
il faut déterminer quel élément de la plage est le dernier.
Bien qu'il soit possible de suivre la longueur du tableau en dehors du modèle, cette méthode entraînerait une valeur statique qui ne tient pas compte des changements dans la longueur du tableau.
La solution réside dans l'exploitation des capacités d'injection de fonctions de Go pour les modèles. En définissant une fonction personnalisée, il devient possible d'identifier dynamiquement le dernier élément :
package main import ( "os" "reflect" "text/template" ) var fns = template.FuncMap{ "last": func(x int, a interface{}) bool { return x == reflect.ValueOf(a).Len() - 1 }, } func main() { t := template.Must(template.New("abc").Funcs(fns).Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if last $i $}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
Cette approche utilise la réflexion pour déterminer dynamiquement la longueur du tableau et la comparer à l'index actuel $i. Lorsque l'index correspond à la longueur du tableau moins un, la dernière fonction renvoie vrai, indiquant que l'élément actuel est le dernier de la plage.
Comme alternative, on peut également utiliser la fonction len sans réflexion :
package main import ( "os" "text/template" ) func main() { t := template.Must(template.New("abc").Parse(`{{range $i, $e := .}}{{if $i}}, {{end}}{{if len .}}and {{end}}{{$e}}{{end}}.`)) a := []string{"one", "two", "three"} t.Execute(os.Stdout, a) }
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!