Maison >développement back-end >Golang >Explication détaillée des méthodes en langage Go
func (s Student) GetName() string { return s.name}func (s *Student) SetName(name string) { s.name = name}
Nous pouvons appeler les méthodes membres dont le type de récepteur est un pointeur une méthode de pointeur, et les méthodes membres dont le type de récepteur est un non-pointeur sont appelées méthodes de valeur.
Lorsque vous devez modifier l'objet, vous devez utiliser un pointeur (passer par référence), sinon déclarer simplement le type comme un littéral (passer par valeur). Évitez également de copier la valeur à chaque appel de méthode.type Integer intfunc (a *Integer) Increase(i Integer) { *a = *a + i}func main() { var a Integer = 2 var b Integer = 2 //a.Increase(b) //(&a).Increase(b) (*Integer).Increase(&a, b) fmt.Println(a)}Cette méthode n'appartient pas à la classe Integer, mais au type pointeur pointant vers Integer, la raison pour laquelle on peut appeler la méthode Increase directement sur une instance est parce que le langage Go. La phase de compilation convertira automatiquement a en type de pointeur correspondant
, donc le code d'appel réel est &a
. (&a).Increase(b)
type A struct { name string}func (a A) Name() string { a.name = "Hi! " + a.name return a.name}func main() { a := A{name: "test"} fmt.Println(a.Name()) fmt.Println(A.Name(a))}
est en fait du sucre syntaxique pour a.Name()
, et la variable a est ce qu'on appelle le récepteur de méthode. A.Name(a)
func NameOfA(a A) string { a.name = "Hi! " + a.name return a.name}func main() { t1 := reflect.TypeOf(A.Name) t2 := reflect.TypeOf(NameOfA) fmt.Println(t1 == t2)// true}Le type de fonction dans le langage Go n'est lié qu'aux paramètres et aux valeurs de retour, donc l'égalité de ces deux types peut prouver que la méthode
est essentiellement une fonction ordinaire et que le récepteur est l'implicite premiers Paramètres .
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!