Maison >développement back-end >Golang >Les variables de boucle de plage de modèle Go sont-elles réinitialisées à chaque itération ?

Les variables de boucle de plage de modèle Go sont-elles réinitialisées à chaque itération ?

DDD
DDDoriginal
2024-12-21 02:20:10881parcourir

Do Go Template Range Loop Variables Reset on Each Iteration?

Variables dans les boucles de plage de modèles Go : sont-elles réinitialisées lors de l'itération ?

Dans les modèles Go, les variables déclarées en dehors d'une boucle de plage ne sont pas réinitialisées à chaque itération. Cependant, un problème survient lors de l'attribution d'une nouvelle valeur à une variable dans la boucle.

Considérez le code suivant :

{{ $prevDate := "" }}
{{ range $post := .Posts }}
    {{ if ne $prevDate $post.Date }}
        <div>

L'intention est de comparer le $prevDate à la date de la publication actuelle. pour déterminer si le message a eu lieu le même jour. Cependant, $prevDate semble être réinitialisé à une chaîne vide au début de chaque itération de boucle.

La raison de ce comportement est que la variable $prevDate est redéclarée dans la boucle. Cela crée une nouvelle variable qui n'a de portée que dans l'itération en cours. La variable $prevDate d'origine reste inchangée en dehors de la boucle.

Pour résoudre ce problème, il existe deux solutions possibles :

Solution n°1 : Utiliser une fonction enregistrée

Vous pouvez enregistrer une fonction personnalisée qui prend l'index actuel et renvoie la date de la publication précédente :

func PrevDate(i int) string {
    if i == 0 {
        return ""
    }
    return posts[i-1].Date
}

Ensuite, dans votre modèle :

{{range $index, $post := .Posts}}
    {{$prevDate := PrevDate $index}}
    ...
{{end}}

Solution n°2 : Utiliser une méthode de publications

Vous pouvez également ajouter une méthode à votre type de publications :

func (p *Posts) PrevDate(i int) string {
    if i == 0 {
        return ""
    }
    return (*p)[i-1].Date
}

Dans votre modèle :

{{range $index, $post := .Posts}}
    {{$prevDate := $.Posts.PrevDate $index}}
    ...
{{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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn