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

超出缓冲区读取

超出缓冲区读取

Go
摇曳的蔷薇 2021-06-25 02:21:38
我有一个缓冲区的大小bufferSize从我的成批读出blockSize,但是,这会产生一些(对我来说)意外的行为,当blockSize超出bufferSize。我把代码放在这里:http://play.golang.org/p/Ra2jicYHPu为什么第二个块只给出 4 个字节?这里发生了什么事?我希望Read总是给出字节数len(byteArray),如果它超出缓冲区,它将通过将缓冲区中的指针设置为 after 来处理这种情况,并将缓冲区byteArray的其余部分 + 超出的任何内容,直到新的缓冲区指针。
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

您的期望不是基于任何记录在案的bufio.Reader. 如果您希望“读取始终提供字节数 len(byteArray)”,则必须使用io.ReadAtLeast。


package main


import (

        "bufio"

        "fmt"

        "io"

        "strings"

)


const bufSize = 10

const blockSize = 12


func main() {

        s := strings.NewReader("some length test string buffer boom")

        buffer := bufio.NewReaderSize(s, bufSize)


        b := make([]byte, blockSize)

        n, err := io.ReadAtLeast(buffer, b, blockSize)

        if err != nil {

                fmt.Println(err)

        }


        fmt.Printf("First read got %d bytes: %s\n", n, string(b))


        d := make([]byte, blockSize)

        n, err = io.ReadAtLeast(buffer, d, blockSize)

        if err != nil {

                fmt.Println(err)

        }


        fmt.Printf("Second read got %d bytes: %s\n", n, string(d))

}



输出:


First read got 12 bytes: some length 

Second read got 12 bytes: test string 


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

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