在接口内返回结构体的 Go 函数类型
在 Go 中,通常使用接口来定义结构体的行为。但是,在使用返回实现接口的结构的函数时,您可能会遇到类型安全错误。
理解问题
让我们检查您提供的代码示例:
package expensive type myStruct struct { ... } // Struct with time-consuming methods func CreateInstance() *myStruct { ... } // Expensive factory function
package main import "expensive" type myInterface interface { DoSomething() } type structToConstruct struct { factoryFunction func() myInterface } func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }
在这里,您定义了一个工厂函数 CreateInstance,它返回一个*我的结构。然后,您创建了 *myStruct 实现的接口 myInterface。但是,您将工厂函数分配给 structToConstruct 中需要返回 myInterface 的函数的字段,从而导致编译错误。
解决问题
要解决此问题,您有两个选项:
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
func CreateInstance() myInterface { return &myStruct{} }
为什么选择 1有效
在选项1中,包装函数将CreateInstance的结果转换为myInterface,然后将其分配给factoryFunction。这满足 structToConstruct 的类型签名,因为包装函数与预期的函数类型匹配。
为什么选项 2 需要提案 12754
在选项 2 中,如果您尝试直接将CreateInstance分配给factoryFunction,Go会抱怨,因为CreateInstance返回的是结构化指针,而不是接口。提案 12754 建议扩展语言以支持此类作业,但最终被拒绝。
以上是如何处理 Go 函数返回实现接口的结构?的详细内容。更多信息请关注PHP中文网其他相关文章!