为了账号安全,请及时绑定邮箱和手机立即绑定

返回接口的函数

返回接口的函数

Go
森栏 2021-12-07 16:05:03
为什么我可以说 CreateLion() 的结果(指向实现 Cat 接口的结构的指针)是 Cat 接口的实例,但我不能说 CreateLion() 是“返回 Cat 的函数”类型界面。”实现这种行为的标准 Golang 方法是什么?package mainimport "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 interfacetype CatFactory func() Cat// define a function that returns a pointer to a Lion structfunc CreateLion() *Lion {    return &Lion{}}
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

尝试这个:


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{}。但是如果函数参数的类型是 a或map[T]interface{},情况就会改变。在这种情况下,类型必须相同。[]interface{}func() interface{}


查看完整回答
反对 回复 2021-12-07
?
呼如林

TA贡献1798条经验 获得超3个赞

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


在您的示例*Lion中与Cat.

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


查看完整回答
反对 回复 2021-12-07
?
12345678_0001

TA贡献1802条经验 获得超5个赞

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


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


var cf CatFactory = func() Cat{

    return CreateLion()

}

catlion := cf()

catlion.Meow()


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信