Heim >Backend-Entwicklung >Golang >Wie setzt man Variablen in Go-Template-Bereichsschleifen ordnungsgemäß zurück?

Wie setzt man Variablen in Go-Template-Bereichsschleifen ordnungsgemäß zurück?

DDD
DDDOriginal
2024-12-20 09:18:12554Durchsuche

How to Properly Reset Variables in Go Template Range Loops?

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!

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