亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創建一個讀取器,讀取前 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 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號