我想读取前N个字节 一次,然后我想读取其余的内容,直到io.EOF。您如何看待以下代码?这是最好的方法吗?
如果给定的阅读器(r)不是以first字节开头,则应返回错误。否则,它应该继续读取其余的在一组固定字节之后(在代码中标记为“ first”)。
您可以将“ first”部分视为魔术格式签名。
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
}
您的实现看起来比必要的参与更多:
type reader struct {
r io.Reader
first []byte
offset int
}
func (r *reader) Read(b []byte) (n int, err error) {
n, err = r.r.Read(b)
for i := 0; r.offset < len(r.first) && i < n; r.offset++ {
if r.first[r.offset] != b[i] {
return n, errors.New("mismatch")
}
i++
}
return n, err
}