我有一个包导出一个函数,该函数返回一个我无法控制的结构指针。我想包装该函数以提供依赖接缝,以便我可以进行一些单元测试。我的想法是,我想要的是假货,而不是外部包装给我的东西。
示例如下:
/////////////////////////////////////
// External Package I can't control.
/////////////////////////////////////
package ex
type Foo struct {
v int
}
func (f *Foo) GetV() int {
return f.v
}
func CreateFoo(v int) *Foo {
return &Foo{v: v}
}
////////////////////////////////////
// Local Package I'm testing.
////////////////////////////////////
type IFoo interface {
GetV() int
}
type factory = func(v int) IFoo
var factoryFn factory = ex.CreateFoo
这会导致错误:
不能在赋值中使用 CreateFoo (type func(int) *Foo) 作为 type func(int) IFoo
既然我认为 *Foo
是一个 IFoo
,为什么不呢?我缺少什么?有没有办法实现我想要做的事情,给自己一个这样的钩子(Hook)?
Playground 示例链接:https://play.golang.org/p/FDckAQGNRgA
最佳答案
返回 IFoo 的函数类型与返回 *Foo 的函数是不同的类型,即使 Foo 满足 IFoo 的要求,Go 也不支持返回类型的协变。
您需要包装该函数
var factoryFn = func(v int) IFoo { return CreateFoo(v) }
关于go - 返回结构指针的函数作为返回接口(interface)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55367797/