


GO Map Itération Trap: Pourquoi toutes les valeurs pointent vers le dernier élément?
Lorsqu'elle est utilisée en combinaison avec les structures de données map
for...range
GO, un piège commun est susceptible de se produire: lors de la traversée de la tranche et de l'ajout d'éléments à map
, toutes les valeurs map
pointent finalement vers le dernier élément. Cet article analysera ses raisons par des exemples de code et fournira des solutions.
Regardons un morceau de code:
type Student Struct { Chaîne de noms Âge int } func main () { m: = make (map [string] * étudiant) étudiants: = [] étudiant { {Nom: "pprof.cn", âge: 18}, {Nom: "test", âge: 23}, {Nom: "blog", âge: 28}, } pour _, Stu: = gamme les étudiants { m [stu.name] = & Stu // Le problème est ici} pour k, v: = range m { fmt.println (k, "=>", v.name) } }
Le résultat attendu de ce code est de stocker chaque structure Student
dans students
dans map
. Cependant, les résultats d'exécution montrent que toutes les valeurs map
indiquent le dernier élément "blog":
<code>pprof.cn => 博客测试=> 博客博客=> 博客</code>
La racine du problème: portée variable de la boucle de for...range
Le problème est que dans la boucle for...range
, stu
ne crée pas une nouvelle variable à chaque itération. Il pointe vers la même adresse mémoire dans la tranche students
. Chaque itération, la valeur de stu
est mise à jour, mais son adresse mémoire reste la même. Ainsi, lorsque la boucle est terminée, tous les pointeurs de map
pointent vers la valeur finale de stu
(le dernier élément).
Solution: créez une nouvelle copie de la variable
Pour résoudre ce problème, nous devons créer une copie de la variable stu
dans chaque itération, en nous assurant que map
stocke différentes adresses de mémoire. Le code modifié est le suivant:
pour _, Stu: = gamme les étudiants { Newstu: = Stu // Créer une copie m [newstu.name] = & newstu }
Ou, un moyen plus concis est de créer directement une nouvelle structure Student
:
pour _, Stu: = gamme les étudiants { m [stu.name] = & étudiant {name: stu.name, Âge: stu.age} // créer une nouvelle instance étudiante}
Avec la modification ci-dessus, chaque valeur de map
pointera vers une adresse mémoire différente, en évitant le cas où toutes les valeurs pointent vers le dernier élément. L'exécution du code modifié obtiendra les résultats attendus.
Espérons que cette explication vous aidera à comprendre les détails des boucles for...range
et des structures de données map
en Go et à éviter de tels pièges.
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!

La journalisation d'erreur d'application GO efficace nécessite d'équilibrer les détails et les performances. 1) L'utilisation de packages de journaux standard est simple mais manque de contexte. 2) Logrus fournit des journaux structurés et des champs personnalisés. 3) ZAP combine les performances et les journaux structurés, mais nécessite plus de paramètres. Un système de journalisation d'erreur complet doit inclure l'enrichissement des erreurs, le niveau de journal, la journalisation centralisée, les considérations de performances et les modes de gestion des erreurs.

Vide InterfacesIngoAreInterfaces avec des étages, représentant l'analyse de la valeur et devait être informé de la maintenance

Go'sconcurrencyModeLelisunieDuetOtsUseofgoroutinesandChannels, offrant auxquels l'offrand de poids et de la responsabilité approfondie axés

Go'sconcurrencyModeLuSeSGoroutinesandChannelStomageConCurrentProgrammingation efficace.1)

Interfaces andPolymorphisMingoenhanceCodeRelevitality andmainaipability.1) Définir les interfaces de théâtre.

TheinitfonctioningorunsautomAticalement pour que la façon dont la convention est en train

Les combinaisons d'interface créent des abstractions complexes dans la programmation GO en décomposant les fonctions en petites interfaces focalisées. 1) Définissez le lecteur, l'écrivain et les interfaces plus étroites. 2) Créez des types complexes tels que le fichier et le réseau de réseaux en combinant ces interfaces. 3) Utilisez la fonction ProcessData pour montrer comment gérer ces interfaces combinées. Cette approche améliore la flexibilité du code, la testabilité et la réutilisabilité, mais il faut prendre soin d'éviter une fragmentation excessive et une complexité combinatoire.

InitisctionsingoaReAutomAticalement compte tenu de la fin de la manière


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

MantisBT
Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP
