Der Unterschied besteht darin, ob der Empfänger einer Methode in Golang ein Zeiger ist oder kein Zeiger

藏色散人
Freigeben: 2021-05-14 18:04:45
nach vorne
2107 Leute haben es durchsucht

Die folgende Tutorial-Kolumne von golang wird Ihnen den Unterschied zwischen dem Empfänger von Methoden in Golang als Zeiger und nicht als Zeiger vorstellen. Ich hoffe, dass er Freunden in Not hilfreich sein wird!

Der Unterschied zwischen dem Empfänger einer Methode in Golang, der ein Zeiger ist und dem, der kein Zeiger ist

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 Beispiel

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

}
Nach dem Login kopieren

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()
}
Nach dem Login kopieren
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 +

T-Methoden.

• 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 enthält, dann enthält der Methodensatz von S T +
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.

Das obige ist der detaillierte Inhalt vonDer Unterschied besteht darin, ob der Empfänger einer Methode in Golang ein Zeiger ist oder kein Zeiger. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage