我在学习的时候:
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)?
衍生可以理解为对 Reader 接口的封装, 并没有"创建"出新的类型(Reader是一个接口类型)
以上三个函数只是在 Reader上增加额外功能, 返回的还是 Reader 类型, 实现了类似于 python 种装饰器的作用; 如果返回 LimitReader, MultiReader, TeeReader 三个类型, 首先就需要进行以下定义:
LimitReader 和 Reader 是不同的类型, io.Copy 函数的签名如下:
所以 LimitReader 不能作为 io.Copy 的入参, 需要为 LimitReader, MultiReader, TeeReader 类型单独实现 io.Copy 函数(io包中所有使用 LimitReader 的函数都要做相应适配); 但实际上 LimitReader, MultiReader, TeeReader 和 Reader 的方法集合并没有区别, 只是对 Reader 进行了简单的封装, 没有必要返回具体的衍生的Reader.