Heim >Backend-Entwicklung >Golang >Warum ändert meine Go-Methode den Instanzwert nicht, es sei denn, ich verwende einen Zeigerempfänger?
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) { ... }
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()) }
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!