Go标准库 IO包-带限制大小的LimitReader详解

LimitedReader

type 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包装

展开阅读全文

页面更新:2024-04-17

标签:断言   切片   字节   瓶子   详解   标记   源码   剩余   个数   实例   大小   标准   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top