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