Détection du dernier élément dans une plage de modèle
Dans un modèle de texte Golang, la directive range parcourt les éléments d'une collection et donne accès à l'élément courant et son index. Bien que ce mécanisme facilite un bouclage efficace, il présente un défi lors de l'identification du dernier élément de la séquence.
Problème :
Envisagez un modèle :
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
Par défaut, ce modèle affichera une liste d'éléments séparés par des virgules :
one, two, three
Cependant, pour générer une sortie lisible par l'homme avec "et" précédant l'élément final, nous devons déterminer le dernier index de la plage.
Solution :
Bien que les opérations arithmétiques ne soient pas directement prises en charge dans les modèles, une solution de contournement consiste à utiliser le package de réflexion de Go :
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 solution introduit une fonction Go en dernier dans la carte des fonctions du modèle. La fonction prend l'index actuel et une collection comme arguments et renvoie vrai si l'index est égal à la longueur de la collection moins un.
En incorporant cette fonction dans le modèle, nous pouvons distinguer le dernier élément et afficher le résultat souhaité. résultat :
one, two, and three
Notes supplémentaires :
Une approche alternative utilise la fonction len pour calculer la longueur de la collection dans le modèle sans avoir besoin de réflexion :
{{range $i, $e := .}}{{if $i}}, {{end}}{{if eq $i (len $)}}and {{end}}{{$e}}{{end}}.`
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!