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

我想读取前N个字节 一次,然后我想读取其余的内容,直到 io.EOF 。您如何看待以下代码?这是最好的方法吗?

如果给定的阅读器(r)的开头不是 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

hmd520 回答:如何创建一个先读取前N个字节然后读取其余N个字节的读取器?

您的实现看起来比必要的要复杂得多:

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
}
本文链接:https://www.f2er.com/3142479.html

大家都在问