Go标准库IO包带限制大小的LimitReader详解
LimitedReadertype LimitedReader struct { R Reader // underlying reader N int64 // max bytes remaining }
LimitedReader从R读取,但将返回的数据量限制为N个字节。每次读取更新N以标记剩余可以读取的字节数。Read在N<=0时或基础R返回EOF时返回EOF。
记忆点:从瓶子最多倒N字节数据出来。
具体实现方法为:func LimitReader(r Reader, n int64) Reader源码分析func (l *LimitedReader) Read(p []byte) (n int, err error) { if l.N <= 0 { return 0, EOF } if int64(len(p)) > l.N { p = p[0:l.N] } n, err = l.R.Read(p) l.N -= int64(n) return }
【分析】
如果切片比N大,就一次倒进去。
如果切片比N小,就多倒几次,l.N为剩下要倒的字节个数。实例srd := strings.NewReader("hello golang") lrd := io.LimitReader(srd, 10) s := make([]byte, 6) n, err := lrd.Read(s) //读了6字节到切片s log.Println(n, err) //断言取出Reader if p,is:=lrd.(*io.LimitedReader);is{ log.Println(p.N) }
打印结果:
2023/02/28 14:54:40 6
2023/02/28 14:54:40 4
【分析】io.LimitReader()返回的是一个接口值 ,需要断言才能取到值。
倒入切片6字节,因此N=10-6=4字节。总结
LimitReader是一个带限制大小N的Reader包装