Heim >Backend-Entwicklung >Golang >Wie setzt man Variablen in Go-Template-Bereichsschleifen ordnungsgemäß zurück?
Zurücksetzen von Variablen in Go-Vorlagenbereichsschleifen
In Go-Vorlagenbereichsschleifen werden außerhalb der Schleife deklarierte Variablen nicht bei jeder Iteration zurückgesetzt. Durch die erneute Deklaration einer Variablen innerhalb der Schleife wird jedoch eine neue Variable erstellt, deren Gültigkeitsbereich nur innerhalb dieser Schleife liegt, was möglicherweise zu unerwartetem Verhalten führt.
Betrachten Sie das folgende Beispiel:
{{ $prevDate := "" }} {{ range $post := .Posts }} {{ if ne $prevDate $post.Date }} <div class="post-date">Posts dated: {{ $post.Date }}</div> {{ end }} <div class="post-content">{{ $post.Content }}</div> {{ $prevDate := $post.Date }} {{ end }}
Hier scheint $prevDate zu sein wird zu Beginn jeder Schleifeniteration auf eine leere Zeichenfolge zurückgesetzt. Dies liegt jedoch nicht an einem Reset-Mechanismus. Stattdessen wird innerhalb der Schleife eine neue Variable $prevDate neu deklariert, die die äußere Variable überschreibt.
Lösung
Um dieses Problem zu vermeiden, ist es wichtig, das Richtige zu verwenden Bereichsbestimmung für Variablen in Bereichsschleifen. Es gibt zwei empfohlene Lösungen:
Lösung 1: Verwendung einer registrierten Funktion
Sie können eine Funktion registrieren, die den Schleifenindex akzeptiert und den gewünschten Wert aus der vorherigen Schleife zurückgibt Iteration. Zum Beispiel:
func PrevDate(i int) string { if i == 0 { return "" } return posts[i-1].Date } // Registering the function: var yourTempl = template.Must(template.New(""). Funcs(map[string]interface{}{"PrevDate": PrevDate}). Parse(yourStringTemplate))
In Ihrer Vorlage können Sie die Funktion dann wie folgt aufrufen:
{{range $index, $post := .Posts}} {{$prevDate := PrevDate $index}} {{end}}
Lösung 2: Verwenden einer Posts-Methode
Alternativ können Sie Ihrem Beitragstyp eine Methode hinzufügen, die das vorherige Datum zurückgibt. Zum Beispiel:
type Post struct { // Your Post type Date string } type Posts []Post func (p *Posts) PrevDate(i int) string { if i == 0 { return "" } return (*p)[i-1].Date }
In Ihrer Vorlage können Sie wie folgt auf die Methode zugreifen:
{{range $index, $post := .Posts}} {{$prevDate := $.Posts.PrevDate $index}} {{end}}
Das obige ist der detaillierte Inhalt vonWie setzt man Variablen in Go-Template-Bereichsschleifen ordnungsgemäß zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!