Heim > Backend-Entwicklung > Golang > Warum ändert meine Go-Methode den Instanzwert nicht, es sei denn, ich verwende einen Zeigerempfänger?

Warum ändert meine Go-Methode den Instanzwert nicht, es sei denn, ich verwende einen Zeigerempfänger?

Mary-Kate Olsen
Freigeben: 2024-12-08 22:11:12
Original
291 Leute haben es durchsucht

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

Golang-Methode mit Zeigerempfänger

Wenn Sie versuchen, den Wert einer Instanz über eine Methode zu ändern, ist es wichtig, das Konzept des Zeigers zu verstehen Empfänger. In diesem Beispiel funktioniert die SetSomeField-Methode nicht wie erwartet, da ihr Empfänger kein Zeigertyp ist.

Um dies zu beheben, ändern wir die SetSomeField-Methode so, dass sie einen Zeigerempfänger akzeptiert:

func (i *Implementation) SetSomeField(newValue string) {
    ...
}
Nach dem Login kopieren

Diese Änderung führt jedoch zu einem neuen Problem: Die Struktur implementiert die Schnittstelle nicht mehr, da die GetSomeField-Methode immer noch einen Wert hat Empfänger.

Die Lösung besteht darin, bei der Implementierung der Schnittstelle einen Zeiger auf die Struktur zu verwenden. Dadurch ermöglichen wir der Methode, die tatsächliche Instanz zu ändern, ohne eine Kopie zu erstellen. Hier ist der geänderte Code:

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}
Nach dem Login kopieren

In diesem aktualisierten Code gibt die Create-Funktion einen Zeiger auf die Implementierungsstruktur zurück, die die IFace-Schnittstelle implementiert. Folglich kann eine Variable vom Typ IFace auf den Zeiger auf die Implementierungsstruktur verweisen, sodass die SetSomeField-Methode ihren Wert ändern kann.

Das obige ist der detaillierte Inhalt vonWarum ändert meine Go-Methode den Instanzwert nicht, es sei denn, ich verwende einen Zeigerempfänger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage