Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erkennt man das letzte Element in einem Go-Vorlagenbereich?

Wie erkennt man das letzte Element in einem Go-Vorlagenbereich?

Linda Hamilton
Linda HamiltonOriginal
2024-11-08 06:24:01982Durchsuche

How to Detect the Last Item in a Go Template Range?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn