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 BeispielIst 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() { } func (t *test) TestPointer() { } func main(){ t := test{} m := test.TestValue m(t) m1 := (*test).TestPointer m1(&t) }Nach dem Login kopieren
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() }
• 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.