Maison > développement back-end > Golang > Pourquoi la mise à jour des valeurs dans une structure Go à l'intérieur d'une boucle ne modifie-t-elle pas la structure d'origine ?

Pourquoi la mise à jour des valeurs dans une structure Go à l'intérieur d'une boucle ne modifie-t-elle pas la structure d'origine ?

DDD
Libérer: 2024-11-16 15:07:03
original
345 Les gens l'ont consulté

Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?

Mettre à jour la valeur dans Struct

Lorsque vous traitez des structures, la mise à jour des valeurs peut poser des défis. Considérez le code suivant :

ftr := FTR{}

err = yaml.Unmarshal([]byte(yamlFile), &ftr)

for index, element := range ftr.Mod {

    switch element.Type {
    case “aaa”, “bbbb”:
        element.Type = "cccc”
    case "htr”:
        element.Type = "com"
    case "no":
        element.Type = "jnodejs"
    case "jdb”:
        element.Type = "tomcat"
    }

}
Copier après la connexion

Après l'exécution de cette boucle, la structure ftr d'origine n'est pas modifiée, malgré les mises à jour apparentes au sein de la boucle. Quel pourrait être le problème ?

Le problème : les pointeurs et le déballage de la structure

Dans Go, passer une structure à une fonction par valeur crée une copie de la structure, contrairement en passant par référence, qui fournit un pointeur vers la structure d'origine. Dans ce cas, itérer sur ftr.Mod à l'aide de range crée des copies des éléments Mod, ce qui signifie que toutes les modifications apportées dans la boucle ne sont pas reflétées dans la structure ftr d'origine.

La solution : utiliser des indices et des pointeurs

Pour modifier la structure ftr d'origine, suivez ces étapes :

  1. Utilisez des indices pour itérer : Parcourez les indices de ftr.Mod au lieu de les éléments eux-mêmes.
  2. Utiliser des pointeurs : Changez le type de Mod dans la définition de la structure en []*Mod.
  3. Accédez aux pointeurs : Dans la boucle, accédez aux valeurs des éléments Mod à l'aide de pointeurs : *ftr.Mod[index].

Voici le code modifié :

type FTR struct {
    Id       string     
    Mod      []*Mod  // Use pointers for Mod
}

for index := range ftr.Mod{
    switch (*ftr.Mod[index]).Type {
    case “aaa”, “bbbb”:
        (*ftr.Mod[index]).Type = "cccc”
    case "htr”:
        (*ftr.Mod[index]).Type = "com"
    case "no":
        (*ftr.Mod[index]).Type = "jnodejs"
    case "jdb”:
        (*ftr.Mod[index]).Type = "tomcat"
    }

}
Copier après la connexion

En utilisant des pointeurs, vous pouvez directement modifier les valeurs dans la structure ftr d'origine.

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