gpt4 book ai didi

go - 为什么从 byte.Buffer 读取时我会得到一个永无止境的循环

转载 作者:IT王子 更新时间:2023-10-29 01:50:12 25 4
gpt4 key购买 nike

目前我正在编写一个从 bytes.Buffer 读取缓冲区的程序。它应该在找到字符 e 时停止阅读。但是当我使用 for 循环读取缓冲区时,我注意到了一些奇怪的事情。当我将字节读取作为 for 语句的一部分时,我得到一个无限循环(example in go playground):

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

但是如果我删除它并将它放在 for 循环中,它不会 ( example in go playground ):

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

谁知道这是为什么?我发现添加 break 表达式是一种非常丑陋且容易出错的解决方法。

最佳答案

因为你的post statement for 循环的 是空的(你只有 init 语句),所以你不会每次迭代都读取下一个字节(v 总是 'u')。

这是 fixed version :

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

评论中提到,在没有'e'字节的情况下,也建议检查错误,避免死循环:

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 在缓冲区为空时返回 io.EOF 错误。

关于go - 为什么从 byte.Buffer 读取时我会得到一个永无止境的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38307234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com