在 Go 中传递兼容接口的切片
在 Go 中,将一个接口的切片传递给需要一个接口的切片的函数时可能会遇到困难不同的接口,即使前者包含后者。为了说明这个问题,考虑两个接口 A 和 B,其中 A 包含 B。
`
type A 接口 {
Close() error Read(b []byte) (int, error)
}
type B interface {
Read(b []byte) (int, error)
}
`
具体来说,Impl struct 实现了两个接口:
`
type Impl struct {}
func (I Impl) Read(b []byte) (int, error) {
return 10, nil
}
func (I Impl) Close() error {
return nil
}
`
虽然单个项目可以毫无问题地跨函数传递,但传递切片会遇到错误:
`
func single(r io.Reader) {
fmt.Println("in single")
}
func slice(r []io.Reader) {
fmt.Println("in slice")
}
impl := &Impl{}
single(impl) / /works
list := []A{impl}
slice(list) // 失败
`
要解决此问题,您必须创建预期的新切片输入 ([]io.Reader) 并用源切片 ([]A) 中的元素填充它:
`
newSlice := make([]io.Reader, len(list))
for i, v := range list {
newSlice[i] = v
}
slice(newSlice)
`
这种方法允许您将一个接口的切片传递给函数期待另一个兼容接口的切片,解决了尝试直接传递原始切片时引发的错误。
以上是Go中如何传递兼容接口的切片?的详细内容。更多信息请关注PHP中文网其他相关文章!