首页 文章

Golang函数返回一个接口

提问于
浏览
5

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

为什么我可以说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 回答

  • 5

    试试这个:

    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 .

  • 1

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

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

    var cf CatFactory = func() Cat{
        return CreateLion()
    }
    catlion := cf()
    catlion.Meow()
    

相关问题