go - 接口(interface)和类型的问题

标签 go

有人可以解释为什么在将 slice 传递给可变参数函数时鸭子类型不起作用。
如下所示的情况 1 和 2 似乎可行,但下面的情况 3 初始化一个 slice ,然后将取消引用的 slice 传递给接受接口(interface)的函数。

错误信息是: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...)
    }

最佳答案

正如 Volker 在评论中提到的那样, slice 不能像其元素那样进行隐式转换。 Gopher 可以像 Animal 一样嘎嘎叫,但是 []Gopher 不能像 []Animal .

实现此功能的最小更改是:

func main() {
    gophers := []Gopher{{}, {}}
    out := make([]Animal, len(gophers))
    for i, val := range gophers {
        out[i] = Animal(val)
    }
    runForest(out...)
}

关于go - 接口(interface)和类型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35443292/

相关文章:

csv - 从我的服务器下载 *.csv

go - redigo golang 客户端是否支持键空间事件通知?

go - 如何验证无效的unicode代码点值?

mongodb - 从 bson 结构转换 protoc 生成的结构的最佳方法是什么?

go - 我可以重新打开已关闭的 channel 吗?

go - 无法将图像转换为 []uint8

arrays - GO - 数组复制是深拷贝还是浅拷贝?

Docker 在运行 go 服务器时没有响应

linux - 为什么 go app 作为多个进程运行?

go - 处理来自多个抽象级别的错误的最佳实践