一尘不染

在Go中,如何将某个接口的切片传递给需要不同兼容接口的切片?

go

我有两个接口,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.Reader

如果我尝试跨函数传递单个项目,则效果很好。但是,如果我尝试A对Expecting函数进行切片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)

如果我可以将传递Asingle(r io.Reader),为什么我不能传递[]Aslice(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

阅读 256

收藏
2020-07-02

共1个答案

一尘不染

我在这里问过类似的问题在Go中,如何使用切片制作泛型函数?

可悲的是,这绝对是Go中的弱点。解决此问题的唯一方法是使用[] A中的元素制作[] io.Reader类型的新切片

2020-07-02