猿问

返回接口的函数

为什么我可以说 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{}

}


森栏
浏览 180回答 3
3回答

明月笑刀无情

尝试这个:package mainimport "fmt"type Cat interface {    Meow()}type Lion struct{}func (l Lion) Meow() {    fmt.Println("Roar")}type CatFactory func() Catfunc CreateLion() Cat {    return Lion{}}func main() {    lion := CreateLion()    lion.Meow()    var cf CatFactory = CreateLion    fLion := cf()    fLion.Meow()}在大多数情况下,您可以将任何类型分配给基本类型interface{}。但是如果函数参数的类型是 a或map[T]interface{},情况就会改变。在这种情况下,类型必须相同。[]interface{}func() interface{}

呼如林

我认为你应该阅读这个博客http://blog.golang.org/laws-of-reflection,它对变量、类型和接口之间的关系很准确。在您的示例*Lion中与Cat.您可以更正CreateLion从*Lion到 的函数返回Cat。

12345678_0001

这里的问题是静态类型的 go 将“这是一个返回猫的函数”与“这是一个返回猫的狮子的函数”区分开来,因此不会接受一个作为另一个。解决这个问题的方法是让你的工厂变量完全符合它的期望:var cf CatFactory = func() Cat{    return CreateLion()}catlion := cf()catlion.Meow()
随时随地看视频慕课网APP

相关分类

Go
我要回答