假设我们有类似的东西:
type ReadHandler interface {
Reader
Reader
}
显然,当我们在Reader
的实例上调用ReadHandeler
接口的成员时,会导致歧义。那么我们如何在Golang中实现这一目标呢?
答案 0 :(得分:4)
1-使用io.MultiReader
,请参阅func MultiReader(readers ...Reader) Reader
文档:
MultiReader返回一个Reader的逻辑连接 提供输入读者。他们按顺序阅读。一旦所有输入 已经返回EOF,Read将返回EOF。如果有任何读者 返回非零,非EOF错误,Read将返回该错误。
2-或命名:
type ReadHandler interface {
Read(p []byte) (n int, err error)
Read2(p []byte) (n int, err error)
}
或:
type ReadHandler interface {
io.Reader
Read2(p []byte) (n int, err error)
}
演示工作示例代码:
package main
import (
"errors"
"fmt"
"io"
)
func main() {
s := my{[]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, []byte{10, 20, 30, 40, 50}}
buf := make([]byte, 5)
n, e := s.Read(buf)
fmt.Println(n, e, buf)
n, e = s.Read2(buf)
fmt.Println(n, e, buf)
}
type ReadHandler interface {
io.Reader
Read2(p []byte) (n int, err error)
}
type my struct {
buf []byte
buf2 []byte
}
func (t *my) Read(p []byte) (n int, err error) {
if len(p) > len(t.buf) {
return 0, errors.New("len(p)>len(buf)")
}
m := copy(p, t.buf)
return m, nil
}
func (t *my) Read2(p []byte) (n int, err error) {
if len(p) > len(t.buf2) {
return 0, errors.New("len(p)>len(buf2)")
}
m := copy(p, t.buf2)
return m, nil
}
输出:
5 <nil> [1 2 3 4 5]
5 <nil> [10 20 30 40 50]
3-命名它:
寻找嵌入接口的通用解决方案(带任意数字 方法),在结构中两次。
type my struct {
io.Reader
Rdr2 io.Reader
}
或
type my struct {
Rdrs []io.Reader
}