Récepteur de pointeur pour les méthodes Golang
En Golang, un récepteur fait référence à un objet responsable de la gestion des appels de méthode. Selon le type de récepteur, il peut être divisé en récepteur de valeur et récepteur de pointeur.
Dans l'exemple donné, le récepteur de la méthode SetSomeField est un récepteur de valeur, ce qui signifie que la méthode opère sur une copie de la variable créée lors de l'appel de la méthode. Cela a pour conséquence que la méthode est incapable de modifier l'instance réelle mais met uniquement à jour la copie, ce qui entraîne un comportement inattendu.
Afin de résoudre ce problème, le récepteur de la méthode SetSomeField doit être remplacé par un récepteur pointeur. Les récepteurs de pointeurs permettent aux méthodes de modifier l'instance réelle car ils accèdent directement à l'adresse mémoire de l'instance.
Cependant, cela va créer un nouveau problème : la structure n'implémente plus l'interface. En effet, l'interface nécessite que la méthode SetSomeField soit définie comme récepteur de valeur et les récepteurs de pointeurs ne sont pas compatibles.
La solution est de créer une fonction Create qui renvoie un type de récepteur de pointeur puis d'attribuer ce pointeur à une variable qui implémente l'interface. Cela permet aux méthodes de modifier l'instance réelle tout en restant conforme à la définition de l'interface :
package main import ( "fmt" ) type IFace interface { SetSomeField(newValue string) GetSomeField() string } type Implementation struct { someField string } func (i *Implementation) GetSomeField() string { return i.someField } func (i *Implementation) SetSomeField(newValue string) { i.someField = newValue } func Create() *Implementation { return &Implementation{someField: "Hello"} } func main() { var a IFace a = Create() a.SetSomeField("World") fmt.Println(a.GetSomeField()) }
En utilisant un récepteur de pointeur, la méthode SetSomeField peut modifier l'instance réelle tout en implémentant l'interface. Cela garantit que la méthode modifie l'état de l'objet comme prévu.
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!