go - 返回结构指针的函数作为返回接口(interface)的函数

标签 go

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

示例如下:

/////////////////////////////////////
// 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/

相关文章:

gopls 替换整个项目中的变量

string - 文本/模板如何确定 map 的 "default textual representation"?

go - 为什么 Go map vs slice 性能在这里有 10 倍的速度差异

debugging - GoLand远程调试显示 "could not find <file>"

go - GO 中的包/函数中毒

windows - Go 语言 : how to install libxml2/gokogiri on windows

multithreading - Chdir 和Setuid 以及Setgid 线程安全吗?

go - 如何使用服务帐户 key JSON 与服务帐户 JSON 发布到 pubsub

go - 简化 golang 中重复出现的 switch case

for-loop - "Select"goroutine 内的 for 循环语句