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


In Go, how do I pass a slice of interface to something that expects slice of a different compatible interface?

本问题已经有最佳答案,请猛点这里访问。

我有两个接口,AB。包括B最后,我有一个具体的实施A(称为EDOCX1〕〔5〕),通过定义,也可以实现B

For example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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的要求也得到了io.Reader的满足。

如果我试着把个人项目跨越功能,那就很好。但是,如果我尝试A的滑块,它是失败的。

Example:

ZZU1

如果我能通过一个Asingle(r io.Reader),为什么我不能通过[]Aslice(r []io.Reader),我该怎么办?

Actual implementation at https://play.golang.org/p/qoreqtqhd just uncomment the last two lines in main()and the error shows:

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

我问过类似的问题在go中,如何用slices生成通用函数?

遗憾的是,这绝对是Go的一个弱点。唯一能解决这个问题的方法是使用来自[]a的元素生成一个新的类型为[]io.reader的切片。