下面的代码确实是不言自明的。

我怎么能说CreateLion()的结果(指向实现Cat接口的结构的指针)是Cat接口的实例,但我不能说CreateLion()的类型是"返回Cat的函数" 接口。"

Golang实现这种行为的标准方法是什么?

尝试这个:

在大多数情况下,可以将任何类型分配给基本类型interface{}。但是,如果函数参数的类型是map[T]interface{}[]interface{}func() interface{},情况就会改变。
在这种情况下,类型必须相同。

我认为您应该阅读此博客http://blog.golang.org/laws-of-reflection,它非常了解变量,类型和接口之间的关系。

在您的示例中,*LionCat不同。

您可以更正功能CreateLion*Lion返回到Cat

这里的问题是静态类型的go将"这是一个返回猫的函数"与"这是一个返回猫的狮子的函数"区分开来,因此不会彼此接受。

解决此问题的方法是为工厂var提供准确的期望值:

进行一些更改即可正常工作。在这里查看:https://play.golang.org/p/ECSpoOIuzEx

另外,尽管Go没有Java样式的接口,但它确实具有接口并且可以实现多态,但是类型在编译时就已知。

如果两种类型都实现相同的接口,则可以为"是"关系建模。但是,在将对象传递到接受该接口类型的函数之前,它不会强制执行该接口。因此,如果您想实现策略模式,则在传递策略对象匹配接口" Cat"时,该函数将接受" Lion"对象,或任何其他使用正确签名实现Meow函数的类。

此外,工厂方法在Go中绝对必要且有用。实际上,在Go中,您可以使用工厂函数代替构造函数来构造对象。