返回接口的函数

新手上路,请多包涵

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

原文由 zian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 408
1 个回答

尝试这个:

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

原文由 Oleksiy Chechel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题