Go 函數類型傳回的結構體與介面不相容
問題:
問題:在Go 中,為什麼傳回實作介面的結構的函數是否不滿足期望欄位的類型要求傳回該介面的函數?
答案:問題在於返回結構體的 Go 函數類型與返回結構體的函數類型不能互換接口,即使該結構實現了該接口。在為結構體中的函數聲明類型簽署時,特定的返回類型必須與聲明的類型相符。修改工廠函數直接傳回介面類型即可解決問題。
package main import "fmt" func main() { thing := structToConstruct{getInstance} thing.performAction() } type myInterface interface { doSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction() instance.doSomething() } func getInstance() myInterface { return &myStruct{} } type myStruct struct{} func (m *myStruct) doSomething() { fmt.Println("doing something") }
範例:
本例修改工廠函數傳回實例myInterface的,滿足以下類型要求structToConstruct.
說明:func wrapper() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}聲明structToConstruct類型時,我們指定factoryFunction應該是傳回myInterface的函數。但是,expense.CreateInstance 函數傳回*myStruct 值,不能直接指派給myInterface。這是因為 Go 介面提供類型安全性,而傳回特定結構類型(例如 *myStruct)的函數無法自動轉換為傳回其實作的介面類型的函數。 要使用 *myStruct value 與 myInterface,我們必須使用類型斷言或透過建立包裝轉換的適配器函數來明確轉換它:
以上是為什麼 Go 函數傳回實作介面的結構體不滿足介面回傳函數欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!