我想讀取前 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
}
- 1 回答
- 0 關注
- 153 瀏覽
添加回答
舉報
0/150
提交
取消