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

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

Barbara Streisand
Barbara Streisand原创
2024-12-06 20:28:13911浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn