登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-27 15:12:51 153浏览 收藏

今天golang学习网给大家带来了《如何创建一个读取器,读取前 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


解决方案


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

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
}

以上就是《如何创建一个读取器,读取前 N 个字节一次,然后读取其余字节?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>