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

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


扬帆大鱼
浏览 91回答 1
1回答

吃鸡游戏

您的实现看起来比必要的更复杂:type reader struct {&nbsp; &nbsp; r&nbsp; &nbsp; &nbsp; io.Reader&nbsp; &nbsp; first&nbsp; []byte&nbsp; &nbsp; offset int}func (r *reader) Read(b []byte) (n int, err error) {&nbsp; &nbsp; n, err = r.r.Read(b)&nbsp; &nbsp; for i := 0; r.offset < len(r.first) && i < n; r.offset++ {&nbsp; &nbsp; &nbsp; &nbsp; if r.first[r.offset] != b[i] {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return n, errors.New("mismatch")&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; i++&nbsp; &nbsp; }&nbsp; &nbsp; return n, err}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go