Pointeurs Go : un examen plus approfondi des récepteurs de valeur et de pointeurs
Dans Go, les pointeurs jouent un rôle crucial dans la gestion efficace de la mémoire et la création de ressources réutilisables. structures de données. Les débutants sont souvent aux prises avec le concept de pointeurs, d'autant plus qu'il diffère des langages comme C/C . Cet article vise à clarifier les nuances des pointeurs Go et à répondre aux idées fausses courantes.
Considérez l'extrait de code ci-dessous, emprunté au Go Tour #52 :
type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} fmt.Println(v.Abs()) }
Ici, nous définissons une structure Vertex, et une méthode Abs qui calcule la valeur absolue d'un sommet. Le récepteur v d'Abs est un pointeur vers Vertex. Cela signifie qu'Abs opère sur des pointeurs vers des sommets, permettant des modifications au sommet d'origine.
Maintenant, considérons une légère modification du code :
func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) }
Fait intéressant, cette modification conduit à le même résultat. Notre question se pose : y a-t-il une différence entre utiliser un *Vertex ou un Vertex comme récepteur pour les Abs ?
La réponse réside dans deux règles fondamentales du Go :
Conversion de récepteur de valeur et de pointeur : Go permet de dériver une méthode avec un récepteur de pointeur à partir d'une méthode avec un récepteur de valeur. Ainsi, func (v Vertex) Abs() float64 génère automatiquement une implémentation supplémentaire :
func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) } func (v *Vertex) Abs() float64 { return Vertex.Abs(*v) } // GENERATED METHOD
Le compilateur trouve de manière transparente la méthode générée, expliquant pourquoi v.Abs() fonctionne toujours même si v n'est pas un pointeur .
Prise d'adresse automatique : Go peut prendre automatiquement l'adresse d'une variable. Cela signifie que lors de l'appel de v.Abs() dans le code modifié sans le récepteur du pointeur, cela équivaut à :
vp := &v vp.Abs()
Ainsi, la fonction reçoit toujours un pointeur vers le sommet, que nous utilisions explicitement ou non & .
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!