Golang函数返回一个接口

问题描述 投票:6回答:3

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

为什么我可以说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{}
}
go
3个回答
6
投票

试试这个:

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{},情况会发生变化。在这种情况下,类型必须相同。


3
投票

我想你应该阅读这篇博客http://blog.golang.org/laws-of-reflection,它是关于变量,类型和接口之间的关系的精确。

在你的例子中,*LionCat不同。

你可以纠正CreateLion*Lion返回到Cat的函数。


2
投票

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

解决这个问题的方法是给你的工厂var完全符合预期:

var cf CatFactory = func() Cat{
    return CreateLion()
}
catlion := cf()
catlion.Meow()
© www.soinside.com 2019 - 2024. All rights reserved.