Maison >développement back-end >Golang >Pourquoi la modification du champ d'une structure Go dans une méthode de réception de valeur ne persiste-t-elle pas ?

Pourquoi la modification du champ d'une structure Go dans une méthode de réception de valeur ne persiste-t-elle pas ?

DDD
DDDoriginal
2024-12-13 03:17:13634parcourir

Why Doesn't Modifying a Go Struct's Field Within a Value Receiver Method Persist?

Modification des structures via des récepteurs de valeurs : comprendre l'effet d'ombrage

En Go, le comportement des récepteurs de méthodes peut avoir un impact profond sur la mutabilité de structures. Comprendre la différence entre les récepteurs de valeurs et les récepteurs de pointeurs est crucial pour manipuler correctement les structures.

Contexte du problème

L'exemple fourni démontre un comportement apparemment inattendu. Le champ d'une structure est modifié au sein d'une méthode, mais la modification ne persiste pas en dehors de la méthode.

type Test struct {
    someStrings []string
}

func (this Test) AddString(s string) {
    this.someStrings = append(this.someStrings, s)
    this.Count() // will print "1"
}

func (this Test) Count() {
    fmt.Println(len(this.someStrings))
}

Lorsque ce code est exécuté, il affiche :

1
0

Ce comportement se produit car la méthode AddString utilise un récepteur de valeur, qui crée essentiellement une copie de la structure lorsque la méthode est invoquée. Les modifications apportées dans la méthode sont appliquées à cette copie, et non à la structure originale. Par conséquent, lorsque Count est invoqué en dehors de la méthode, il opère sur la structure d'origine non modifiée.

Récepteurs de pointeur vs récepteurs de valeur

Pour résoudre ce problème, un pointeur Le récepteur doit être utilisé à la place d’un récepteur de valeur. Les récepteurs pointeurs créent une référence à la structure d'origine, permettant une manipulation directe.

func (t *Test) AddString(s string) {
    t.someStrings = append(t.someStrings, s)
    t.Count() // will print "1"
}

Avec un récepteur pointeur, la méthode AddString opère directement sur la structure du récepteur. La modification de someStrings est ainsi reflétée dans la structure originale. Par conséquent, lorsque Count est invoqué en dehors de la méthode, il opère sur la structure modifiée.

Conclusion

En comprenant la différence entre les récepteurs de valeurs et les récepteurs de pointeurs, vous peut manipuler efficacement les structures dans Go. Les récepteurs de valeur créent des copies, tandis que les récepteurs de pointeurs fournissent un accès direct à la structure d'origine. Cette nuance est cruciale pour garantir que les changements apportés au sein des méthodes sont persistants en dehors de ces méthodes.

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