Go 中的多態性:存在嗎?
多態性,即不同類別的物件具有相同方法的能力,是一個基本面向物件導向程式設計。然而,在 Go 中,介面的 setter 方法似乎不可用。
讓我們來看一個基本範例:
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 }
執行此程式碼時,MyStruct 類型的 Set 方法失敗,因為接收者不是指標。當函數退出時,對此所做的任何更改都會遺失。
人們可能會嘗試透過將接收器更改為指標來修復此問題:
func (this *MyStruct) Set(i int) { this.data = i }
但是,這會導致編譯錯誤。 Go 中的介面方法不能有指標接收器。
那麼,在這種情況下有沒有辦法實現多態性?
最接近的替代方法是使用介面類型和實作介面的匿名結構:
type MyInterfacer interface { Get() int Set(i int) } var mi MyInterfacer = &MyStruct{123} fmt.Println(mi.Get()) // prints 123 mi.Set(456) fmt.Println(mi.Get()) // prints 456
雖然此解決方案不是真正的多態性,但它利用介面來提供一種乾淨而靈活的方式來操作不同類型的物件。
以上是Go 是否支援多態性:尋找 Setter 方法的解決方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!