Golang函数返回一个接口

zia*_*ian 10 go

下面的代码实际上是不言自明的.

为什么我可以说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{}
}
Run Code Online (Sandbox Code Playgroud)

Ole*_*hel 9

试试这个:

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()
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当然你的代码可能会工作,但这不是一个好的答案,他不是在寻找工作代码,他想要一个解释。 (2认同)
  • 这个答案很糟糕,因为现在 CreateLion 返回一个 Cat,并且您不再可以访问任何 Lion 特定的行为。CatFactory 返回一只猫是有意义的,但 CreateLion 应该返回一个 Lion。 (2认同)

小智 6

我认为你应该阅读这个博客http://blog.golang.org/laws-of-reflection,它对变量、类型和接口之间的关系很准确。

在您的示例*Lion中与Cat.

您可以更正CreateLion*Lion到 的函数返回Cat


小智 5

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

解决这个问题的方法是让你的工厂变量完全符合它的期望:

var cf CatFactory = func() Cat{
    return CreateLion()
}
catlion := cf()
catlion.Meow()
Run Code Online (Sandbox Code Playgroud)