Portée des variables de boucle de plage dans les modèles Go
Dans les modèles Go, il est important de comprendre comment les variables déclarées dans une boucle de plage interagissent avec les variables déclarées en dehors de la boucle.
Considérez l'extrait de code suivant :
{{ $prevDate := "" }} {{ range $post := .Posts }} {{ if ne $prevDate $post.Date }} <div>
Le L'objectif est de comparer la date de la publication actuelle avec la date de la publication précédente pour afficher un en-tête de section lorsque la date change. Cependant, la valeur de $prevDate semble être réinitialisée à une chaîne vide au début de chaque itération.
Le problème réside dans la portée des variables dans la boucle de plage. Chaque itération de la boucle crée une nouvelle variable masquée $prevDate. Cela signifie que la valeur de $prevDate déclarée en dehors de la boucle n'est pas modifiée, tandis que la variable masquée est modifiée dans la boucle.
Par conséquent, le problème peut être résolu en utilisant les alternatives suivantes :
Solution n°1 : Fonction enregistrée
Enregistrez une fonction qui prend l'index actuel et renvoie la date de la publication précédente, si disponible :
func PrevDate(i int) string { if i == 0 { return "" } return posts[i-1].Date }
Ensuite, utilisez la fonction dans le modèle :
{{range $index, $post := .Posts}} {{$prevDate := PrevDate $index}} {{end}}
Solution n°2 : Méthode de type de publication
Ajouter une méthode au type Posts pour obtenir la date précédente :
func (p *Posts) PrevDate(i int) string { if i == 0 { return "" } return (*p)[i-1].Date }
Ensuite, utilisez la méthode dans le modèle :
{{range $index, $post := .Posts}} {{$prevDate := $.Posts.PrevDate $index}} {{end}}
En utilisant ces solutions, la variable $prevDate peut conserver sa valeur à travers les itérations de la boucle de plage, vous permettant de comparer efficacement les dates de publication.
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!