// BufferedReadWriteCloser has all of the methods
// from *bufio.Reader and io.ReadWriteCloser.
type BufferedReadWriteCloser struct {
*bufio.Reader
io.ReadWriteCloser
}
func (rw *BufferedReadWriteCloser) Read(p []byte) (int, error) {
return rw.Reader.Read(p)
}
func peek(r io.Reader, n int) ([]byte, error) {
bi := bufio.NewReader(r)
peeked, err := bi.Peek(n)
if err != nil {
return nil, err
}
// Use type assertion to check if r implements the
// io.Seeker interface. If it does, then use it to
// reset the offset.
if seeker, ok := r.(io.Seeker); ok {
seeker.Seek(0, 0)
}
return peeked, nil
}
2条答案
按热度按时间8aqjt8rx1#
因为bufio.Reader缓冲来自基础读取器的数据,所以应用程序必须在调用Peek之后从bufio.Reader读取数据。
要获得一个这样做的io. ReadWriteCloser,请 Package bufio. Reader和原始io. ReadWriteCloser:
下面是如何使用它:
rw
的值满足io.ReadWriteCloser接口。不要求或假设io.ReadWriteCloser具有Seek方法。
xuo3flqw2#
正如我在上面的评论中提到的,您需要访问原始读取器的
Seek
方法,这意味着将读取器作为io.ReadWriteCloser
传递是不够的,下面的helper函数可能是一种解决方法:现在你可以把
io.ReadWriteCloser
传递给peek
函数,peek
函数检查读取器是否实现了Seek
方法,如果实现了Seek
方法,那么peek
将调用它。