下面的代码实际上是不言自明的 .
为什么我可以说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{}
}
3 回答
试试这个:
在大多数情况下,您可以将任何类型分配给基本类型
interface{}
. 但是如果函数参数的类型是map[T]interface{}
,[]interface{}
或func() interface{}
,情况会发生变化 . 在这种情况下,类型必须相同 .我想你应该阅读这篇博客http://blog.golang.org/laws-of-reflection,它确切地说明了变量,类型和接口之间的关系 .
在您的示例中,
*Lion
与Cat
不同 .您可以将函数
CreateLion
从*Lion
更改为Cat
.这里的问题是静态类型去区分“这是一个返回猫的函数”,“这是一个返回狮子的函数”,因此不会接受另一个 .
解决这个问题的方法是给你的工厂var完全符合预期: