首页 > 后端开发 > Golang > 如何分配一个返回结构体的函数来实现 Go 中的接口?

如何分配一个返回结构体的函数来实现 Go 中的接口?

Barbara Streisand
发布: 2024-12-06 20:28:13
原创
887 人浏览过

How to Assign a Function Returning a Struct Implementing an Interface in Go?

使用通过接口返回结构体的 Go 函数类型

问题:

在 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(类型 func() *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中文网其他相关文章!

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