Erkennen des letzten Elements in einem Vorlagenbereich
In Go-Vorlagen ermöglicht das Durchlaufen von Arrays oder Slices mithilfe der Bereichsaktion einen bequemen Zugriff auf Array-Elemente. Manchmal ist es jedoch notwendig, die letzte Iteration von den anderen zu unterscheiden.
Stellen Sie sich eine Vorlage vor, die eine eindeutige Formatierung für das letzte Element in einem Bereich erfordert:
{{range $i, $e := .SomeField}} {{if $i}}, {{end}} $e.TheString {{end}}
Diese Vorlage würde eine Ausgabe generieren wie:
one, two, three
Um dieses Verhalten zu ändern und „und“ vor dem letzten Element auszugeben:
one, two, and three
man muss Bestimmen Sie, welches Element im Bereich das letzte ist.
Obwohl es möglich ist, die Länge des Arrays außerhalb der Vorlage zu verfolgen, würde diese Methode zu einem statischen Wert führen, der Änderungen in der Länge des Arrays nicht berücksichtigt.
Die Lösung liegt in der Nutzung der Funktionsinjektionsfunktionen von Go für Vorlagen. Durch die Definition einer benutzerdefinierten Funktion wird es möglich, das letzte Element dynamisch zu identifizieren:
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) }
Dieser Ansatz nutzt Reflektion, um die Länge des Arrays dynamisch zu bestimmen und sie mit dem aktuellen Index $i zu vergleichen. Wenn der Index mit der Array-Länge minus eins übereinstimmt, gibt die letzte Funktion „true“ zurück und gibt an, dass das aktuelle Element das letzte im Bereich ist.
Alternativ kann man auch die len-Funktion ohne Reflektion verwenden:
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) }
Das obige ist der detaillierte Inhalt vonWie erkennt man das letzte Element in einem Go-Vorlagenbereich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!