Avant-propos
Récemment, j'ai lu un site Web et un étudiant m'a demandé si le récepteur d'une méthode en golang est un pointeur ou pas Quelle est la différence entre les pointeurs ? Ici je vais l'expliquer dans une méthode simple et facile à comprendre pour aider les étudiants qui viennent d'apprendre le golang
Quoi. est la méthode ?
En fait, tant que vous comprenez ce principe, vous pouvez fondamentalement le comprendre. Le problème mentionné ci-dessus est en fait une fonction spéciale, et. le récepteur est le premier argument transmis implicitement
Est-ce facile à comprendre ? Ajoutons maintenant du code pour voir la différence entre les pointeurs et les non-pointeurs.Par exemple
type test struct{ name string } func (t test) TestValue() { } func (t *test) TestPointer() { } func main(){ t := test{} m := test.TestValue m(t) m1 := (*test).TestPointer m1(&t) }
type test struct{ name string } func (t test) TestValue() { fmt.Printf("%p\n", &t) } func (t *test) TestPointer() { fmt.Printf("%p\n", t) } func main(){ t := test{} //0xc42000e2c0 fmt.Printf("%p\n", &t) //0xc42000e2e0 m := test.TestValue m(t) //0xc42000e2c0 m1 := (*test).TestPointer m1(&t) }Je suppose que certains étudiants ont déjà compris que lorsqu'il ne s'agit pas d'un pointeur, une fois les paramètres réels transmis, la valeur est copiée. Par conséquent, la valeur est copiée à chaque fois que TestValue() est appelé.
Quel sera le résultat si cela implique de modifier la valeur ?
type test struct{ name string } func (t test) TestValue() { fmt.Printf("%s\n",t.name) } func (t *test) TestPointer() { fmt.Printf("%s\n",t.name) } func main(){ t := test{"wang"} //这里发生了复制,不受后面修改的影响 m := t.TestValue t.name = "Li" m1 := (*test).TestPointer //Li m1(&t) //wang m() }
Donc, tout le monde, les étudiants doivent faire attention lorsqu'ils rencontrent de tels problèmes en programmation
Alors, quelle est la relation entre ces ensembles de méthodes ? Ici, j'ai emprunté les notes de qyuhen. après avoir étudié à Golang, je recommande également aux amis qui aiment le golang de lire ce livre, il est très utile pour approfondir la compréhension du golang.
• L'ensemble de méthodes de type T contient toutes les méthodes du récepteur T.
T contient toutes les méthodes du récepteur T +Bien que Golang soit simple et facile à utiliser, il présente encore de nombreux pièges L'auteur a rencontré de nombreux pièges dans le processus d'utilisation de Golang, qui seront mentionnés dans le blog. plus tard. Tout le monde est le bienvenu. Discutons ensemble.T.
• Si le type S contient un champ anonyme T, alors l'ensemble de méthodes de S contient T méthodes. • Si le type S contient le champ anonyme T, alors l'ensemble de méthodes de S contient les méthodes T +
T.
• Indépendamment de l'intégration de T ou T, l'ensemble des méthodes S contient toujours les méthodes T + *T.
Conclusion