Go 返回结构指针的函数作为返回接口的函数

Go 返回结构指针的函数作为返回接口的函数,go,Go,我有一个导出函数的包,该函数返回一个我无法控制的结构指针。我希望包装该函数以提供依赖项接缝,这样我就可以进行一些单元测试。这个想法是,我想要一个假的,而不是外部软件包给我的 例如: ///////////////////////////////////// // External Package I can't control. ///////////////////////////////////// package ex type Foo struct { v int } func

我有一个导出函数的包,该函数返回一个我无法控制的结构指针。我希望包装该函数以提供依赖项接缝,这样我就可以进行一些单元测试。这个想法是,我想要一个假的,而不是外部软件包给我的

例如:

/////////////////////////////////////
// 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(类型func(int)*Foo)用作赋值中的类型func(int)IFoo

既然我认为
*Foo
IFoo
,为什么不呢?我错过了什么?有没有办法实现我想要做的,给自己一个这样的钩子


示例链接:

返回IFoo的函数类型与返回*Foo的函数类型不同,即使Foo满足IFoo的要求,Go也不支持返回类型的协方差

您需要包装函数

var factoryFn = func(v int) IFoo { return CreateFoo(v) }

一个选项可能是
var factoryFn factory=func(v int)IFoo{return CreateFoo(v)}
。然后您可以删除显式类型并使用
var factoryFn=func(v int)IFoo{return CreateFoo(v)}
Boy我觉得很傻。这是一个很好/很容易绕过限制的方法。谢谢我有点担心我误解了“结构指针”和“接口”之间的关系,所以我仍然想知道为什么我不能做那个作业。当你的评论进来时,我正忙着键入更详细的解释作为回答。您可能需要阅读协方差和逆变换,这将帮助您理解为什么函数类型不可互换。