Go 中的介面實作:傳回結構體的函數型別
使用Go 時,常常會遇到函數傳回結構體的情況實作一個介面。但是,當嘗試將函數指派給需要介面實例的欄位時,您可能會遇到類似於「無法在欄位值中使用 [函數] 作為類型 [介面]」的錯誤。
要理解這一點錯誤,澄清返回結構體指標 (struct) 的函數不會自動實現為該結構體定義的介面是至關重要的。換句話說,struct 和 struct 在 Go 中是不同的類型。
在給定的範例中,函數getInstance 預計返回myInterface,這是行為(介面)的描述而不是具體的實現(結構體)。然而,getInstance傳回一個指向myStruct實作(*myStruct)的指針,它與myInterface型別不相容。
要解決這個問題,你需要修改getInstance 回傳一個實例myStruct 結構體,如下面更正後的程式碼所示:
package main import "fmt" func main() { var function func() myInterface function = getInstance newSomething := function() newSomething.doSomething() } type myInterface interface { doSomething() } type myStruct struct{} func (m *myStruct) doSomething() { fmt.Println("doing something") } func getInstance() myInterface { return &myStruct{} }
myStruct 實現myInterface 接口,並且getInstance 函數返回正確的type.
雖然上述方法有效,但Go 提出了一項語言更改,如果具體類型實現了接口,則會自動將傳回特定類型的函數轉換為傳回介面的函數。然而,由於潛在的性能和安全問題,該提案被拒絕。以上是為什麼傳回結構體指標的 Go 函數不自動實作介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!