我想读取前 N 个字节 一次,然后读取其余字节直到io.EOF。您对以下代码有何看法?这是最好的方法吗?
如果给定的读取器 (r) 不是从第一个字节开始,则它应该返回错误。否则,它应该在一组固定字节(在代码中标记为“第一个”)之后继续读取其余部分。
您可以将“第一”部分视为神奇的格式签名。
type reader struct {
r io.Reader
first []byte
}
func (r *reader) Read(b []byte) (n int, err error) {
const first = "first"
n, err = r.r.Read(b)
if len(r.first) >= len(first) {
return n, err
}
if l := len(first); n > l {
b = b[:l]
}
r.first = append(r.first, b...)
if len(r.first) >= len(first) {
if !bytes.HasPrefix(r.first, []byte(first)) {
err = errors.New("not first")
}
}
return n, err
}
源代码在playground上:https ://play.golang.org/p/4xzEQcaXYXc
吃鸡游戏
相关分类