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 :
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 }
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") }
Ce programme génère :
Address of v is 0xf8400cfc00 Address of copy is 0xf8400cfcd0 Pointer argument is 0xf8400cfc00
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!