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

时间:2019-03-26 23:49:51

标签: go

我有一个导出函数的包,该函数返回我无法控制的结构指针。我想包装该函数以提供依赖项,以便进行一些单元测试。我的想法是我要假货,而不是外部包装给我的东西。

一个例子如下:

 <link rel="shortcut icon" href="fav.ico" />

这将导致错误: ///////////////////////////////////// // 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

由于我认为cannot use CreateFoo (type func(int) *Foo) as type func(int) IFoo in assignment*Foo,为什么不呢?我想念什么?有没有办法实现我想要做的事情,给自己一个这样的钩子?

示例的游乐场链接:https://play.golang.org/p/FDckAQGNRgA

1 个答案:

答案 0 :(得分:1)

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

您需要包装函数

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