Maison > développement back-end > Golang > Comment empêcher la réinitialisation des variables dans les boucles de plage de modèles Go ?

Comment empêcher la réinitialisation des variables dans les boucles de plage de modèles Go ?

Barbara Streisand
Libérer: 2024-12-23 09:08:28
original
975 Les gens l'ont consulté

How to Prevent Variable Resetting in Go Template Range Loops?

Réinitialisation des variables dans les boucles de plage de modèles Go

Dans les modèles HTML Go, un défi courant survient lorsque l'on tente de conserver les valeurs des variables à travers les itérations d'un boucle de plage. Lorsque des variables sont déclarées en dehors de la boucle, leurs valeurs peuvent sembler se réinitialiser à chaque itération, ce qui entrave la fonctionnalité prévue.

Pour comprendre ce phénomène, plongeons dans la mécanique des boucles de plage de modèles. Chaque itération fonctionne dans sa propre portée, où les variables redéclarées à l'intérieur de la boucle ne sont visibles que dans cette itération spécifique. Cela signifie que les variables déclarées en dehors de la boucle ne sont pas accessibles ou modifiables au sein des itérations.

A titre d'exemple, considérons le modèle suivant :

{{ $prevDate := "" }}
{{ range $post := .Posts }}
    {{ if ne $prevDate $post.Date }}
        <div>
Copier après la connexion

Initialement, $prevDate est censé maintenir le date du message précédent, permettant la comparaison dans l'instruction if pour identifier les changements de date. Cependant, le problème réside dans la redéclaration répétée de $prevDate. Chaque itération crée une nouvelle portée de variable, l'isolant efficacement de la précédente. En conséquence, $prevDate est réinitialisé à sa valeur initiale de "" au début de chaque itération.

Pour trouver une solution, nous pouvons soit exploiter les fonctions du modèle, soit les méthodes fournies par des structures externes.

Solution 1 : Fonction de modèle enregistrée

En définissant une fonction de modèle, nous pouvons transmettre l'index actuel de l'itération et renvoie la date du message précédent.

func PrevDate(i int) string {
    if i == 0 {
        return ""
    }
    return posts[i-1].Date
}
Copier après la connexion

Cette fonction peut être enregistrée et ensuite utilisée dans le modèle comme suit :

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

Solution 2 : méthode de structure externe

Alternativement, nous pouvons ajouter une méthode au type Posts qui permet de récupérer le message précédent date.

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

Dans le modèle, nous pouvons invoquer cette méthode comme :

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

Les deux solutions relèvent efficacement le défi du maintien des valeurs variables à travers les itérations de plage, permettant ainsi la fonctionnalité souhaitée dans Go modèles.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal