Go 中的多態性:仔細觀察介面方法和指標接收器
Go 本身不支援多態性,但可以透過使用介面實現。這就引入了一個常見問題:為什麼介面不允許使用 setter 方法?
如提供的程式碼所示,當 setter 方法定義為值接收器時,函數內所做的變更在退出時會遺失。將接收器修改為指標接收器可以實現永久更改,但會引發編譯錯誤。
為了解決這個問題,Go 提供了一個解決方法。更正後的程式碼將setter方法的接收者修改為指標。這使得該函數能夠修改底層資料結構並保留變更。修改後的程式碼使用了接口,確保可以透過接口存取指針接收器方法。
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()) }
雖然這不是嚴格的多態性,但它透過使用介面和指標接收器有效地實現了類似的結果。此程式碼可用於透過介面設定屬性,乾淨地封裝資料和操作。
以上是為什麼 Go 介面不能直接支援 Setter 方法,如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!