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
Libérer: 2024-12-21 02:20:10
original
961 Les gens l'ont consulté

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>
Copier après la connexion

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
}
Copier après la connexion

Ensuite, dans votre modèle :

{{range $index, $post := .Posts}}
    {{$prevDate := PrevDate $index}}
    ...
{{end}}
Copier après la connexion

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
}
Copier après la connexion

Dans votre modèle :

{{range $index, $post := .Posts}}
    {{$prevDate := $.Posts.PrevDate $index}}
    ...
{{end}}
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal