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

Was ist der Unterschied zwischen dem Empfänger einer Methode in Golang, der ein Zeiger ist und nicht?

藏色散人
藏色散人nach vorne
2020-11-18 15:18:392407Durchsuche

Die folgende Spalte des golang-Tutorials wird Ihnen eine detaillierte Erklärung des Unterschieds zwischen dem Empfänger der Methode in golang geben, der ein Zeiger ist und kein Zeiger ist. Ich hoffe, dass er für Freunde hilfreich sein wird brauchen!

Was ist der Unterschied zwischen dem Empfänger einer Methode in Golang, der ein Zeiger ist und nicht?

Vorwort

Kürzlich fragte mich ein Student auf der Website, was der Unterschied zwischen dem Empfänger einer Methode in Golang ist, der ein Zeiger ist und kein Zeiger. Hier werde ich es auf einfache und leicht verständliche Weise erklären -Verstehen Sie, wie Sie Schülern helfen können, die gerade Golang gelernt haben.

Solange Sie dieses Prinzip verstehen, können Sie im Grunde die oben genannten Probleme verstehen ist der erste Parameter, der implizit übergeben wird.

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

sehr einfach zu verstehen? Fügen wir nun den Code hinzu, um den Unterschied zwischen Zeigern und Nicht-Zeigern zu erkennen.

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 es bereits verstanden Wenn die tatsächlichen Parameter übergeben werden, obwohl sie keine Zeiger sind, wird der Wert jedes Mal kopiert, wenn TestValue() aufgerufen wird.

Was wird dann das Ergebnis sein, 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.

Was ist also die Beziehung zwischen diesen Methodensätzen? Hier leihe ich mir Qyuhens Lesenotizen in Golang aus (https://github.com/qyuhen/book). Empfehlen Sie Freunden, die Golang mögen, die Lektüre dieses Buches, das sehr hilfreich ist, um das Verständnis von Golang zu vertiefen.

• 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 vonWas ist der 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