我有两个接口,A和B。碰巧A包括B。最后,我有一个具体的实现A(称为Impl),根据定义,它也实现了B。
A
B
Impl
例如:
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。
Read()
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)
如果我可以将传递A给single(r io.Reader),为什么我不能传递[]A给slice(r []io.Reader),我将如何纠正它?
single(r io.Reader)
[]A
slice(r []io.Reader)
https://play.golang.org/p/QOREQJTQhD上的实际实现只是取消注释了最后两行,main()并且错误显示:
main()
main.go:38: cannot use list (type []A) as type []io.Reader in argument to slice
我在这里问过类似的问题在Go中,如何使用切片制作泛型函数?
可悲的是,这绝对是Go中的弱点。解决此问题的唯一方法是使用[] A中的元素制作[] io.Reader类型的新切片