dsc71976 2016-07-11 12:42
浏览 187
已采纳

为什么从byte.Buffer读取时出现永无休止的循环

Currently I'm writing a program that is reading a buffer from bytes.Buffer. Its supposed to stop reading when it finds the character e. But when I was reading the buffer using a for loop I noticed something odd. When I put the byte reading as part of the for statement I get an infinity loop (example in go playground):

b := bytes.NewBuffer([]byte("uoiea"))
for v, _ := b.ReadByte(); v != 'e'; {
    println("The value is " + string(v))
}

But if I removed it and put it inside the for loop, it doesn't (example in go playground):

b := bytes.NewBuffer([]byte("uoiea"))
for ;; {
    v, _ := b.ReadByte()
    println("The value is " + string(v))
    if v == 'e'{
        break
    }
}

Does anyone know why is this? I find it that adding the break expression is a very ugly and error prone way to solve this.

  • 写回答

2条回答 默认 最新

  • doulie0178 2016-07-11 12:48
    关注

    Because your post statement of the for-loop is empty (you have only init statement), so you don't read next byte every iteration (v is always 'u').

    Here is the fixed version:

    b := bytes.NewBuffer([]byte("uoiea"))
    for v, _ := b.ReadByte(); v != 'e'; v, _ = b.ReadByte() {
        println("The value is " + string(v))
    }
    

    As mentioned in comments, it's also recommended to check the error to avoid infinite loop when there is no 'e' byte:

    b := bytes.NewBuffer([]byte("uoiea"))
    for v, e := b.ReadByte(); v != 'e' && e == nil; v, e = b.ReadByte() {
        println("The value is " + string(v))
    }
    

    ReadBytes returns io.EOF error when buffer is empty.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料