为何返回的都是Reader,而不是具体的哪个衍生的Reader呢( LimitReader )?

我在学习的时候:
https://github.com/preytaren/...

func LimitReader(r Reader, n int64) Reader

func MultiReader(readers ...Reader) Reader

func TeeReader(r Reader, w Writer) Reader

这样定义衍生的Reader: LimitReader MultiReader TeeReader
为何这里返回的都是Reader,而不是具体的哪个衍生的Reader呢( LimitReader MultiReader TeeReader)?

回复
阅读 680
1 个回答

衍生可以理解为对 Reader 接口的封装, 并没有"创建"出新的类型(Reader是一个接口类型)

func LimitReader(r Reader, n int64) Reader
func MultiReader(readers ...Reader) Reader
func TeeReader(r Reader, w Writer) Reader

以上三个函数只是在 Reader上增加额外功能, 返回的还是 Reader 类型, 实现了类似于 python 种装饰器的作用; 如果返回 LimitReader, MultiReader, TeeReader 三个类型, 首先就需要进行以下定义:

type LimitReader interface {
     Read(p []byte) (n int, err error)
}

type MultiReader interface {
     Read(p []byte) (n int, err error)
}

type TeeReader interface {
     Read(p []byte) (n int, err error)
}

LimitReader 和 Reader 是不同的类型, io.Copy 函数的签名如下:

func Copy(dst Writer, src Reader) (written int64, err error) {
    return copyBuffer(dst, src, nil)
}

// 为 LimitReader 实现
func Copy(dst Writer, src LimitReader) (written int64, err error) {
    return copyBuffer(dst, src, nil)
}

所以 LimitReader 不能作为 io.Copy 的入参, 需要为 LimitReader, MultiReader, TeeReader 类型单独实现 io.Copy 函数(io包中所有使用 LimitReader 的函数都要做相应适配); 但实际上 LimitReader, MultiReader, TeeReader 和 Reader 的方法集合并没有区别, 只是对 Reader 进行了简单的封装, 没有必要返回具体的衍生的Reader.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏