首页 > 后端开发 > Golang > 如何处理 Go 函数返回实现接口的结构?

如何处理 Go 函数返回实现接口的结构?

Barbara Streisand
发布: 2024-12-08 04:18:09
原创
517 人浏览过

How Can I Handle Go Functions Returning Structs Implementing Interfaces?

在接口内返回结构体的 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 的函数的字段,从而导致编译错误。

解决问题

要解决此问题,您有两个选项:

  1. 包装函数:你可以将您的工厂函数包装在主包中。例如:
wrapper := func() myInterface { return expensive.CreateInstance() }
thing := structToConstruct{wrapper}
登录后复制
  1. 修改工厂函数: 或者,您可以修改 CreateInstance 以直接返回 myInterface:
func CreateInstance() myInterface { return &myStruct{} }
登录后复制

为什么选择 1有效

在选项1中,包装函数将CreateInstance的结果转换为myInterface,然后将其分配给factoryFunction。这满足 structToConstruct 的类型签名,因为包装函数与预期的函数类型匹配。

为什么选项 2 需要提案 12754

在选项 2 中,如果您尝试直接将CreateInstance分配给factoryFunction,Go会抱怨,因为CreateInstance返回的是结构化指针,而不是接口。提案 12754 建议扩展语言以支持此类作业,但最终被拒绝。

以上是如何处理 Go 函数返回实现接口的结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板