Maison > développement back-end > Golang > Pourquoi les méthodes Struct Setter de Go se comportent-elles différemment lors de l'utilisation de récepteurs Value et de récepteurs Pointer ?

Pourquoi les méthodes Struct Setter de Go se comportent-elles différemment lors de l'utilisation de récepteurs Value et de récepteurs Pointer ?

Linda Hamilton
Libérer: 2024-12-24 20:08:17
original
125 Les gens l'ont consulté

Why Do Go's Struct Setter Methods Behave Differently When Using Value vs. Pointer Receivers?

Comprendre les méthodes de définition pour les types de structure

Les types de structure dans Go offrent un moyen pratique de regrouper les données associées, et les méthodes de définition nous permettent de modifier leurs propriétés. Cependant, certains scénarios peuvent conduire à un comportement inattendu.

Description du problème :

Considérons une structure T avec un champ Val et deux fonctions de définition : SetVal et SetVal2. L'utilisation de SetVal ne modifie pas la structure d'origine, contrairement à SetVal2. Comprendre cet écart est crucial.

Mécanisme sous-jacent :

Lors du passage d'une structure à une fonction, deux approches sont possibles :

  • Passage par valeur : Crée une copie de la structure. Toute modification apportée au sein de la fonction n'affecte que la copie.
  • Passage par référence (pointeur) : Fournit un pointeur vers la structure d'origine, permettant aux modifications de persister.

Raisonnement :

SetVal prend une structure comme paramètre de valeur. Par conséquent, une copie de la structure est créée dans la fonction, et toute modification apportée à t (la copie) n'a pas d'impact sur la v d'origine.

Résolution du problème :

Utilisez l'approche du récepteur de pointeur dans SetVal2 pour garantir que les modifications sont reflétées dans l'original. struct :

func (t *T) SetVal(s string) {
    t.Val = s
}
Copier après la connexion

Vérification :

Ajout d'instructions d'impression pour démontrer la différence :

type T struct { Val string }

func (t T) SetVal(s string) {
    fmt.Printf("Address of copy is %p\n", &t)
}

func (t *T) SetVal2(s string) {
    fmt.Printf("Pointer argument is %p\n", t)
}

func main() {
    v := T{"abc"}
    fmt.Printf("Address of v is %p\n", &v)
    v.SetVal("pdq")
    v.SetVal2("xyz")
}
Copier après la connexion

Ce programme génère :

Address of v is 0xf8400cfc00
Address of copy is 0xf8400cfcd0
Pointer argument is 0xf8400cfc00
Copier après la connexion

Les adresses de v et le pointeur dans SetVal2 sont égales, confirmant l'utilisation de la structure d'origine, tandis que SetVal travaille sur une copie.

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