go - 在 Go 中,如何将接口(interface) slice 传递给需要不同兼容接口(interface) slice 的对象?

标签 go

<分区>

我有两个接口(interface),AB。碰巧 A 包含 B。最后,我有一个 A 的具体实现(称之为 Impl),根据定义,它也实现了 B

例如:

type A interface {
    Close() error
    Read(b []byte) (int, error)
}

type Impl struct {}
func (I Impl) Read(b []byte) (int, error) {
    fmt.Println("In read!")
    return 10, nil
}
func (I Impl) Close() error {
    fmt.Println("I am here!")
    return nil
}

由于A需要Read(),而Impl实现了A,所以也满足io .阅读器.

如果我尝试跨函数传递单个项目,它工作正常。但是,如果我尝试将 A 的 slice 用于期望 io.Reader 的函数,它会失败。

例子:

func single(r io.Reader) {
    fmt.Println("in single")
}
func slice(r []io.Reader) {
    fmt.Println("in slice")
}
im := &Impl{}

// works
single(im)

// FAILS!
list := []A{t}
slice(list)

如果我可以将 A 传递给 single(r io.Reader),为什么我不能将 []A 传递给 slice(r []io.Reader),我该如何更正它?

实际实现在 https://play.golang.org/p/QOREQJTQhD只需取消注释 main() 中的最后两行,错误显示:

main.go:38: cannot use list (type []A) as type []io.Reader in argument to slice

最佳答案

我在这里问过类似的问题 In Go, how can I make a generic function with slices?

可悲的是,这绝对是围棋的弱点。解决这个问题的唯一方法是使用 []A

中的元素制作一个 []io.Reader 类型的新 slice

关于go - 在 Go 中,如何将接口(interface) slice 传递给需要不同兼容接口(interface) slice 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40806029/

相关文章:

go - IPFS http响应偶尔出现正确的主体的EOF错误

sql - 如何从数组中动态生成 SQL 查询列名和值?

go - 为什么他们不同

go - 如何使用 go 客户端在 kubernetes 服务上观看事件

linux - Golang : How to cross compile on Linux for Windows

go - 如何在 Windows 中为 golang 配置 glide(用于 vendor 包)

go - golang 中的长查询

go - 如何处理 gosec linter 警告 : Potential file inclusion via variable

sql-server - 带有 Golang SQL 驱动程序和 UUID 的 MS SQL 唯一标识符

go - 在golang中设置测试文件中的变量