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

接口和类型的问题

接口和类型的问题

Go
ibeautiful 2021-12-13 18:44:42
有人可以解释为什么当切片传递给可变参数函数时鸭子类型不起作用。如下所示的情况 1 和 2 似乎有效,但下面的情况 3 初始化一个切片,然后将取消引用的切片传递给接受接口的函数。错误信息是: cannot use gophers (type []Gopher) as type []Animal in argument to runForestpackage main    import (        "fmt"    )    type Animal interface {        Run() string    }    type Gopher struct {    }    func (g Gopher) Run() string {        return "Waddle.. Waddle"    }    func runForest(animals ...Animal) {        for _, animal := range animals {            fmt.Println(animal.Run())        }    }    func main() {        //works        runForest(Gopher{})        //works        runForest(Gopher{},Gopher{})        // does not work        gophers := []Gopher{{},{}}        runForest(gophers...)    }
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

切片不能像它们的元素那样隐式转换。一个Gopher可以像一个一样嘎嘎叫Animal,但一个[]Gopher不能像一个一样嘎嘎叫[]Animal。


使其工作的最小变化是:


func main() {

    gophers := []Gopher{{}, {}}

    out := make([]Animal, len(gophers))

    for i, val := range gophers {

        out[i] = Animal(val)

    }

    runForest(out...)

}


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

添加回答

举报

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