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 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架