接口和类型的问题

有人可以解释为什么当切片传递给可变参数函数时鸭子类型不起作用。

如下所示的情况 1 和 2 似乎有效,但下面的情况 3 初始化一个切片,然后将取消引用的切片传递给接受接口的函数。


错误信息是: cannot use gophers (type []Gopher) as type []Animal in argument to runForest


package 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...)

    }


ibeautiful
浏览 163回答 1
1回答

喵喵时光机

切片不能像它们的元素那样隐式转换。一个Gopher可以像一个一样嘎嘎叫Animal,但一个[]Gopher不能像一个一样嘎嘎叫[]Animal。使其工作的最小变化是:func main() {    gophers := []Gopher{{}, {}}    out := make([]Animal, len(gophers))    for i, val := range gophers {        out[i] = Animal(val)    }    runForest(out...)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go