如何创建先读取前N个字节然后读取其余N个字节的读取器?

问题描述 投票:0回答:1

我想读取前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
}

源代码在操场上:https://play.golang.org/p/4xzEQcaXYXc

go
1个回答
0
投票

您的实现看起来比必要的参与更多:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.