go - 不能在映射值中使用 my_module.New(类型 func() (*my_module.MyModule, error))作为类型 func() (core.Module, error)

标签 go

在我的程序中,我有一个名为 core.Module 的接口(interface)和一个实现此接口(interface)的结构,名为 my_module.MyModule。创建这些实现我的接口(interface)的结构的函数被添加到映射中,以便稍后按名称调用它们:

type moduleConstructor func() (core.Module, error)

constructors := make(map[string]moduleConstructor)
constructors["name"] = my_module.New

不幸的是,唯一的方法是创建以下 New 函数:

func New() (core.Module, error) {
} 

我非常愿意使用推荐的签名:

func New() (*my_module.MyModule, error) {
}

然而,这会导致以下错误:

cannot use my_module.New (type func() (*my_module.MyModule, error)) as type 
func() (core.Module, error) in map value

是否有可能以某种方式使映射接受返回实现接口(interface)的结构的函数,而不是直接返回该接口(interface)?

最佳答案

您可以使用一个简单的匿名函数为您的 map 形成兼容的函数签名,而无需更改 my_module.New 定义。匿名函数仍然在其主体中调用 my_module.New:

constructors["name"] = func New() (core.Module, error) {
    return my_module.New()
} 

关于go - 不能在映射值中使用 my_module.New(类型 func() (*my_module.MyModule, error))作为类型 func() (core.Module, error),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030591/

相关文章:

go - 为什么结构的字段是 "non-name"

golang gofmt 包重写通配符

go - 检查方法类型是否与函数类型匹配

go - 如何使用 dep golang 的 fork 包?

go - 如何拉伸(stretch)条目小部件

将日期打印到控制台

go - 如何设计一个返回另一个只能紧急实现的接口(interface)类型的接口(interface)

go - 不能用作 go 中的分配类型

c - 与 C 相比,为什么 Go 向文件写入字节很慢

pointers - 在golang中将一个指针转换为另一种类型