Golang Go语言中 bufio.Buffered 返回 0 一个未解决 bug
最近再练手精进 网上弄了段代码 运行发型 bufio.Buffered()永远返回 0
package main
import (
“bufio”
“fmt”
“strings”
)
func main() {
//原始字符串
str := “12345678901234567890123456789012345678901234567890”
//将字符串转换为流式 I/O 对象
strReader := strings.NewReader(str)
//设置读缓存区大小
bufReader := bufio.NewReaderSize(strReader, 16) //16byte
//缓存读
p := make([]byte, 4)
n, err := bufReader.Read(p)
if err != nil {
panic(err)
}
buffered := bufReader.Buffered()
fmt.Printf("buffered:%d, content:%s\n", buffered, p[:n])
}
网上搜来搜去只返回一个结果
13 年前有人 report 过 4 年前也有人遇到过 到现在是不是还没解决?
https://groups.google.com/g/golang-nuts/c/1smBsPOdFT0
I'm having a similar problem as the original poster. I expect Buffered() to return the number of bytes that can be read from the current buffer, like the documentation states. However a call to Buffered() returns 0 both before and after a call to any Read() that finds bytes in the buffer. In my case the Reader is a net.Conn.
How do we use Buffered() properly? This is the only google result I could find that even mentions using the function.
I ended up solving my problem without using bufio. -Sam
Golang Go语言中 bufio.Buffered 返回 0 一个未解决 bug
更多关于Golang Go语言中 bufio.Buffered 返回 0 一个未解决 bug的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
啥版本?似乎 v1.20+ 没这个问题 https://go.dev/play/p/0Iqldy6RqNY?v=goprev
更多关于Golang Go语言中 bufio.Buffered 返回 0 一个未解决 bug的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
输出:buffered:12, content:1234
不是 12 吗,哪是 0 ?
试着跑了一下:
buffered:12, content:1234
❯ go version
go version go1.20.6 darwin/arm64
❯ go run main.go
buffered:12, content:1234
go 1.18 输出: buffered:12, content:1234
和楼上一样:
go version
warning: GOPATH set to GOROOT (D:\devtools\go) has no effect
go version go1.19.5 windows/amd64
buffered:12 ,context:1234
所以,建议这种问题先把版本号发出来
在Go语言中,bufio.Buffered
函数返回的是缓冲区中当前未读取的字节数。如果你在使用这个函数时遇到了返回值为0,并且你认为这是一个未解决的bug,这里有几个可能的解释和排查步骤:
-
缓冲区为空:首先确认你的缓冲区是否确实已经读取了所有数据,或者是否根本没有写入数据。如果缓冲区是空的,
bufio.Buffered
返回0是预期的行为。 -
读取操作:在调用
bufio.Buffered
之前,是否有其他代码已经读取了缓冲区中的数据?如果数据在调用bufio.Buffered
之前被读取,那么缓冲区中的未读字节数自然会是0。 -
多线程/并发访问:如果你的程序在多线程或并发环境下运行,确保对缓冲区的访问是线程安全的。不正确的并发访问可能会导致缓冲区状态不一致,从而影响
bufio.Buffered
的返回值。 -
缓冲区类型:确认你使用的是
bufio.Reader
类型的缓冲区,因为bufio.Buffered
是bufio.Reader
的方法。 -
Go版本:检查你使用的Go语言版本,确保不是由于某个已知但已修复的bug导致的问题。可以通过查阅Go语言的官方发行说明和bug跟踪系统来获取相关信息。
如果以上步骤都无法解决问题,并且你确信这是一个bug,可以考虑在Go语言的官方问题跟踪系统中提交一个issue,并提供详细的代码示例和复现步骤。