Polymorphismus in Go: Ein genauerer Blick auf Schnittstellenmethoden und Zeigerempfänger
In Go wird Polymorphismus nicht nativ unterstützt, kann aber sein wird über Schnittstellen erreicht. Dies wirft eine häufig gestellte Frage auf: Warum sind Setter-Methoden für Schnittstellen nicht zulässig?
Wie im bereitgestellten Code gezeigt, gehen Änderungen, die innerhalb der Funktion vorgenommen werden, beim Beenden verloren, wenn die Setter-Methode als Wertempfänger definiert ist . Das Ändern des Empfängers in einen Zeigerempfänger ermöglicht dauerhafte Änderungen, führt jedoch zu einem Kompilierungsfehler.
Um dieses Problem zu beheben, bietet Go eine Problemumgehung. Der korrigierte Code ändert den Empfänger der Setter-Methode in einen Zeiger. Dadurch kann die Funktion die zugrunde liegende Datenstruktur ändern und die Änderungen beibehalten. Der geänderte Code verwendet eine Schnittstelle und stellt so sicher, dass über die Schnittstelle auf die Zeigerempfängermethode zugegriffen werden kann.
package main import "fmt" type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this *MyStruct) Get() int { return this.data } func (this *MyStruct) Set(i int) { this.data = i } func main() { s := &MyStruct{123} fmt.Println(s.Get()) s.Set(456) fmt.Println(s.Get()) var mi MyInterfacer = s mi.Set(789) fmt.Println(mi.Get()) }
Obwohl dies kein reiner Polymorphismus ist, wird durch die Verwendung von Schnittstellen und Zeigerempfängern effektiv ein ähnliches Ergebnis erzielt. Der Code kann verwendet werden, um Eigenschaften über eine Schnittstelle festzulegen und so Daten und Vorgänge sauber zu kapseln.
Das obige ist der detaillierte Inhalt vonWarum können Go-Schnittstellen Setter-Methoden nicht direkt unterstützen und wie kann dies umgangen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!