Interface Go:工厂返回指针和接口{}类型

Interface Go:工厂返回指针和接口{}类型,interface,go,factory,Interface,Go,Factory,考虑以下工厂: 这给了我以下错误:不能在赋值中使用NewTypeA(type func()*TypeA)作为type func()接口{},这一点非常清楚 我认为接口{}能够与指针匹配 我找到了这个解决方案: 这给了我期望的类型*TypeA。 有没有其他方法可以直接使用接口{}类型而不是“哑”接口(实体)?在您的第二个示例中NewTypeA()返回实体而不是*TypeA,因此它与NewTypeA()返回接口{}的解决方案没有区别使实体类型完全不需要/冗余: type TypeA struct {

考虑以下工厂:

这给了我以下错误:
不能在赋值中使用NewTypeA(type func()*TypeA)作为type func()接口{},这一点非常清楚

我认为
接口{}
能够与指针匹配

我找到了这个解决方案:

这给了我期望的类型
*TypeA

有没有其他方法可以直接使用
接口{}
类型而不是“哑”接口(
实体
)?

在您的第二个示例中
NewTypeA()
返回
实体
而不是
*TypeA
,因此它与
NewTypeA()
返回
接口{}的解决方案没有区别
使
实体
类型完全不需要/冗余:

type TypeA struct {
    placeholder int
}

func NewTypeA() interface{} {
    return new(TypeA)
}

func main() {
    factory := make(map[string]func() interface{})
    factory["TypeA"] = NewTypeA

    tmp := factory["TypeA"]()
    fmt.Printf("%T", tmp)
}
输出(在上尝试):

保留
*TypeA
返回类型 为了方便起见,如果希望
NewTypeA()
factory函数仍然返回
*TypeA
,可以通过在
工厂映射中放置匿名包装函数来实现:

func NewTypeA() *TypeA {
    return new(TypeA)
}

func main() {
    factory := make(map[string]func() interface{})
    factory["TypeA"] = func() interface{} { return NewTypeA() }

    tmp := factory["TypeA"]()
    fmt.Printf("%T", tmp)
}
再次输出():


我认为您不完全理解接口{}是什么,因此试图错误地使用它

如下列文件所述:

接口{}类型,即空接口,是许多问题的根源 混乱

我建议你读一下那篇文章,然后再看看你想做什么

接口{}不是任何其他类型的占位符,它是一个

因此,如果您创建了一个将返回接口{}的函数作为键的映射,那么这就是函数需要返回的类型。不是指针、int或其他任何东西

虽然可以为接口分配任何类型的值,包括指针类型,但不能使用其他类型代替接口{}类型


似乎您试图实现的是一个映射,其中包含可以返回任何类型值的函数。您只能通过不同的功能设计间接地做到这一点。您必须在函数中使用接口{}类型,分配要返回给它的值,然后返回接口{}。但是您必须返回接口{}类型,而不是int、string或*TypeA之类的类型。

当然!为什么我没想到呢?非常感谢。顺便说一下,我不知道
%t
标志。谢谢你的文章!几个月前,当我开始使用go时,我把它弄红了。这对我来说还不是很清楚,我会再看一遍。
type TypeA struct {
    placeholder int
}

func NewTypeA() interface{} {
    return new(TypeA)
}

func main() {
    factory := make(map[string]func() interface{})
    factory["TypeA"] = NewTypeA

    tmp := factory["TypeA"]()
    fmt.Printf("%T", tmp)
}
*main.TypeA
func NewTypeA() *TypeA {
    return new(TypeA)
}

func main() {
    factory := make(map[string]func() interface{})
    factory["TypeA"] = func() interface{} { return NewTypeA() }

    tmp := factory["TypeA"]()
    fmt.Printf("%T", tmp)
}
*main.TypeA