您已经很接近解决方案了-
唯一出错的地方
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方法(这一点很重要
ReadBE在上调用
bufferedReader,而不是直接在上调用,
net.Conn因为
Peek将数据存储在缓冲区中,因此后续调用
Read需要能够首先从该缓冲区中读取任何数据,然后再返回基础
net.Conn)。
newBufferedConnSize鉴于当前的默认缓冲区大小为4096字节,该函数可能是不必要的,但是从技术上讲,如果您要依赖能够以
Peek给定大小进行调用并且不让它返回错误(特别是
ErrBufferFull),则应显式设置它的大小至少要与您打算窥视的字节数一样大。
在Go Playground上检查一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)