下面的代码实际上是不言自明的。
为什么我可以说CreateLion()的结果,一个实现Cat接口的结构的指针,是Cat接口的一个实例,但我不能说CreateLion()的类型为“返回Cat的函数”接口。”
实现这种行为的标准Golang方法是什么?
package main
import "fmt"
func main() {
var lion Cat := CreateLion()
lion.Meow()
// this line breaks. Why?
var cf CatFactory = CreateLion
}
type Cat interface {
Meow()
}
type Lion struct {}
func (l Lion) Meow() {
fmt.Println("Roar")
}
// define a functor that returns a Cat interface
type CatFactory func() Cat
// define a function that returns a pointer to a Lion struct
func CreateLion() *Lion {
return &Lion{}
}
试试这个:
package main
import "fmt"
type Cat interface {
Meow()
}
type Lion struct{}
func (l Lion) Meow() {
fmt.Println("Roar")
}
type CatFactory func() Cat
func CreateLion() Cat {
return Lion{}
}
func main() {
lion := CreateLion()
lion.Meow()
var cf CatFactory = CreateLion
fLion := cf()
fLion.Meow()
}
在大多数情况下,您可以将任何类型分配给基本类型interface{}
。但是,如果函数参数的类型是map[T]interface{}
,[]interface{}
或func() interface{}
,情况会发生变化。在这种情况下,类型必须相同。
我想你应该阅读这篇博客http://blog.golang.org/laws-of-reflection,它是关于变量,类型和接口之间的关系的精确。
在你的例子中,*Lion
与Cat
不同。
你可以纠正CreateLion
从*Lion
返回到Cat
的函数。
这里的问题是静态类型去区分“这是一个返回猫的函数”,“这是一个返回狮子的函数”,因此不会接受另一个。
解决这个问题的方法是给你的工厂var完全符合预期:
var cf CatFactory = func() Cat{
return CreateLion()
}
catlion := cf()
catlion.Meow()