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.
说明:
声明structToConstruct 类型时,我们指定factoryFunction 应该是一个返回myInterface 的函数。但是,expense.CreateInstance 函数返回*myStruct 值,该值不能直接分配给myInterface。这是因为 Go 接口提供类型安全性,返回特定结构类型(例如 *myStruct)的函数无法自动转换为返回其实现的接口类型的函数。
要使用 *myStruct value 与 myInterface,我们必须使用类型断言或通过创建包装转换的适配器函数来显式转换它:
func wrapper() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
以上是为什么 Go 函数返回实现接口的结构体不满足接口返回函数字段?的详细内容。更多信息请关注PHP中文网其他相关文章!