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
DDDoriginal
2024-11-16 15:07:03332parcourir

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"
    }

}

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"
    }

}

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:
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