"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi ma méthode GO ne modifie-t-elle pas la valeur d'instance à moins que j'utilise un récepteur de pointeur?

Pourquoi ma méthode GO ne modifie-t-elle pas la valeur d'instance à moins que j'utilise un récepteur de pointeur?

Publié le 2025-02-06
Parcourir:304

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

Méthode Golang avec le récepteur de pointeur

Lorsque vous essayez de modifier la valeur d'une instance via une méthode, il est crucial pour comprendre le concept de pointeur récepteurs. Dans cet exemple, la méthode SetSomeField ne fonctionne pas comme prévu car son récepteur n'est pas de type de pointeur.

Pour rectifier cela, nous modifions la méthode SetSomeField pour accepter un récepteur de pointeur comme suit:

func (i *Implementation) SetSomeField(newValue string) {
    ...
}

Cependant, ce changement introduit un nouveau problème: la structure n'implémente plus l'interface car la méthode getomefield a toujours un récepteur de valeur.

La solution réside dans l'utilisation d'un pointeur vers la structure lorsque Implémentation de l'interface. Ce faisant, nous permettons à la méthode de modifier l'instance réelle sans créer de copie. Voici le code modifié:

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())
}

Dans ce code mis à jour, la fonction de création renvoie un pointeur vers la structure d'implémentation, qui implémente l'interface iface. Par conséquent, la variable de type iface peut se référer au pointeur de la structure d'implémentation, permettant à la méthode SetSomefield de modifier sa valeur.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3