无需阅读就可以窥视Conn

无需阅读就可以窥视Conn,第1张

无需阅读就可以窥视Conn

您已经很接近解决方案了-
唯一出错的地方

Conn
就是首先阅读本身。你是正确的
bufio.Reader
Peek
方法是要走的路。诀窍是首先使缓冲的读取器生效,然后调用
Peek
缓冲的读取器,而不是从原始读取器进行读取
Conn
。这是一种
bufferedConn
可以满足您需要的类型:

type bufferedConn struct {    r        *bufio.Reader    net.Conn // So that most methods are embedded}func newBufferedConn(c net.Conn) bufferedConn {    return bufferedConn{bufio.NewReader(c), c}}func newBufferedConnSize(c net.Conn, n int) bufferedConn {    return bufferedConn{bufio.NewReaderSize(c, n), c}}func (b bufferedConn) Peek(n int) ([]byte, error) {    return b.r.Peek(n)}func (b bufferedConn) Read(p []byte) (int, error) {    return b.r.Read(p)}

这样做是允许你访问所有的正常

net.Conn
方法(通过嵌入
net.Conn
-你也可以写的包装功能,但是这是一个极大的方便,更清洁),并另外提供访问
bufferedReader
Peek
Read
方法(这一点很重要
Read
BE在上调用
bufferedReader
,而不是直接在上调用,
net.Conn
因为
Peek
将数据存储在缓冲区中,因此后续调用
Read
需要能够首先从该缓冲区中读取任何数据,然后再返回基础
net.Conn
)。

newBufferedConnSize
鉴于当前的默认缓冲区大小为4096字节,该函数可能是不必要的,但是从技术上讲,如果您要依赖能够以
Peek
给定大小进行调用并且不让它返回错误(特别是
ErrBufferFull
),则应显式设置它的大小至少要与您打算窥视的字节数一样大。

在Go Playground上检查一下。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5028640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存