Vorwort
Kürzlich hat mich ein Student auf der Website gefragt, was der Unterschied zwischen dem Empfänger einer Methode in Golang ist, der ein Zeiger ist und kein Zeiger. Hier werde ich die Methode auf einfache und verständliche Weise erklären Mit diesem Prinzip können Sie im Grunde die oben genannten Probleme verstehen.
Die Methode ist eigentlich eine spezielle Funktion, und der Empfänger ist implizit. Der erste tatsächliche Parameter wird übergeben.Nehmen Sie ein Beispieltype 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) }Ist es leicht zu verstehen? Fügen wir nun den Code hinzu, um zu sehen, was der Unterschied zwischen Zeigern und Nicht-Zeigern ist.
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) }
Ich denke, einige Schüler haben bereits verstanden, dass der Wert kopiert wird, wenn er übergeben wird, obwohl er kein Zeiger ist Sobald TestValue() aufgerufen wird, wird der Wert kopiert.
Was wird also passieren, wenn der Wert geändert wird?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() }Also müssen alle Schüler aufpassen, wenn sie auf solche Probleme beim Programmieren stoßen Diese Methodensätze? Hier habe ich Qyuhens Notizen aus dem Golang-Studium ausgeliehen. Ich empfehle auch Freunden, die Golang mögen, dieses Buch zu lesen, was sehr hilfreich ist, um das Verständnis von Golang zu vertiefen Methoden.
• Die Menge der Methoden vom Typ
T enthält alle Empfänger-T +
• Wenn Typ S ein anonymes Feld T enthält, dann enthält der Methodensatz von S T Methoden.
• Wenn Typ S das anonyme Feld
T-Methoden.• Unabhängig von der Einbettung von T oder
T enthält der Satz der S-Methoden immer T + *T-Methoden.
FazitObwohl Golang einfach und leicht zu verwenden ist, birgt es dennoch viele Fallstricke bei der Verwendung von Golang, die später im Blog erwähnt werden.