Heim  >  Artikel  >  Backend-Entwicklung  >  Über den Unterschied zwischen dem Empfänger einer Methode in Golang, der ein Zeiger ist und nicht

Über den Unterschied zwischen dem Empfänger einer Methode in Golang, der ein Zeiger ist und nicht

藏色散人
藏色散人nach vorne
2021-04-19 16:56:401458Durchsuche

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!

Über den Unterschied zwischen dem Empfänger einer Methode in Golang, der ein Zeiger ist und nicht

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

Vorwort

Kürzlich habe ich eine Website gelesen und ein Klassenkamerad fragte, was der Unterschied zwischen dem Empfänger einer Methode in ist Golang ist ein Zeiger und kein Zeiger. Hier wird eine leicht verständliche Methode erklärt, um Schülern zu helfen, die gerade Golang gelernt haben. Solange Sie dieses Prinzip verstehen. Sie können die oben genannten Probleme im Grunde verstehen. Empfänger Es ist der erste tatsächliche Parameter, der implizit übergeben wird.

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

Ist es jetzt leicht zu verstehen? Was ist der Unterschied zwischen Zeigern und Nicht-Zeigern?

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 verstanden, dass der Wert kopiert wird, wenn der tatsächliche Parameter übergeben wird, wenn er kein Zeiger ist Wert wird kopiert.

Was wird also das Ergebnis sein, wenn es darum geht, den Wert zu ändern?
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 beim Programmieren auf solche Probleme stoßen Ich habe Qyuhens Notizen aus dem Golang-Studium ausgeliehen, und ich empfehle auch Freunden, die Golang mögen, es zu lesen. Dieses Buch ist eine große Hilfe bei der Vertiefung des Verständnisses von Golang.

• 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.

Fazit


Obwohl 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 vonÜber den Unterschied zwischen dem Empfänger einer Methode in Golang, der ein Zeiger ist und nicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen