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

为什么从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条)

报告相同问题?