Polymorphismus in Go: Schnittstellenimplementierung
Während Go den traditionellen Polymorphismus nicht unterstützt, bieten Schnittstellen eine Möglichkeit, einen ähnlichen Effekt zu erzielen. Bei der Implementierung von Setter-Methoden bestehen jedoch Einschränkungen.
Das Problem
Beachten Sie den folgenden Code:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data }
Der Versuch, die Set-Methode zu implementieren, führt zu Ergebnissen in einem Fehler:
func (this MyStruct) Set(i int) { this.data = i }
Lösung
Um diese Einschränkung zu umgehen, muss der Empfänger in der Set-Methode ein Zeiger sein, wie in:
func (this *MyStruct) Set(i int) { this.data = i }
Dadurch kann die Methode die zugrunde liegenden Daten ändern, die sich in der Schnittstellenvariablen widerspiegeln.
Korrigiert Code
Der folgende korrigierte Code funktioniert wie vorgesehen:
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()) }
Diese Technik ist zwar kein echter Polymorphismus, ermöglicht aber ein ähnliches Maß an Flexibilität durch Schnittstellenimplementierung in Go.
Das obige ist der detaillierte Inhalt vonWarum erfordern die Interface-Setter-Methoden von Go Zeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!