为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
扬帆大鱼 2023-07-31 17:30:36
我想读取前 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
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

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


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

}


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信