Go 中的多態性:介面實現
雖然Go 不支援傳統的多態性,但介面提供了一種實現類似效果的方法。但是,在實作 setter 方法時存在限制。
問題
考慮以下程式碼:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data }
嘗試實作 Set方法結果在一個錯誤:
func (this MyStruct) Set(i int) { this.data = i }
解決方案
要規避此限制,Set 方法中的接收者必須是指針,如下所示:
func (this *MyStruct) Set(i int) { this.data = i }
這允許方法修改底層數據,這反映在介面中
修正的程式碼
以下更正後的程式碼按預期工作:
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()) }
雖然不是真正的多態性,但此技術允許類似的透過Go 中的介面實現實現靈活性。
以上是為什麼 Go 的介面 Setter 方法需要指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!