問題:
在Go 中,我有一個結構體實現接口的包。在另一個依賴套件中,我想建立此結構的假實作以用於測試目的。然而,當我嘗試指派一個傳回實作該介面的變數的介面的結構的函數時,Go 會抱怨類型安全。
架構:
// Package expensive type myStruct struct{} func (m *myStruct) DoSomething() {...} func (m *myStruct) DoSomethingElse() {...} func CreateInstance() *myStruct {...} // Expensive to call // Package main type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() {...}
錯誤:
「無法使用昂貴的.CreateInstance( expense.myStruct) as type func() myInterface in field value"
答案:
出現此問題是因為 CreateInstance 函數傳回一個 *myStruct 值,該值與來自factoryFunction 所需的func() myInterface 類型。若要解決此問題:
// Package main type myInterface interface { DoSomething() } type myStruct struct{} func (m *myStruct) DoSomething() {...} func getInstance() myInterface { return &myStruct{} }
透過此修改,getInstance 現在會傳回 myInterface 類型,允許將其指派給factoryFunction。
附加說明:
wrapper := func() myInterface { return expensive.CreateInstance() }
以上是如何分配一個傳回結構體的函數來實作 Go 中的介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!