Go 里面这样可以实现一个允许可重复读、多次副本读的 io.Reader
,还挺好玩的,感觉又在 #套娃……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
结果:
1 2 3 4 5 6 7 8 9 10 11 |
|
主要原理是:
- 通过
TeeReader
把从原始接口读出来的数据顺便写一份拷贝到内存Buffer
里面(io.Writer
); - 然后下次读的时候,首先从内存读(
io.Reader
),然后继续从原始的数据读; - 通过内存
Buffer
的Bytes()
重建一个bytes.Reader
支持了io.Seeker
1。
由于是在内存中缓存的,所以要小心数据不能太大。否则应该用文件实现缓冲(io.ReadWriteSeeker
)。
-
奇怪为什么
bytes.Buffer
不支持Seek
? ^