Golang Go语言中 bufio.Buffered 返回 0 一个未解决 bug

发布于 1周前 作者 sinazl 来自 Go语言

最近再练手精进 网上弄了段代码 运行发型 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

8 回复

啥版本?似乎 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,这里有几个可能的解释和排查步骤:

  1. 缓冲区为空:首先确认你的缓冲区是否确实已经读取了所有数据,或者是否根本没有写入数据。如果缓冲区是空的,bufio.Buffered 返回0是预期的行为。

  2. 读取操作:在调用 bufio.Buffered 之前,是否有其他代码已经读取了缓冲区中的数据?如果数据在调用 bufio.Buffered 之前被读取,那么缓冲区中的未读字节数自然会是0。

  3. 多线程/并发访问:如果你的程序在多线程或并发环境下运行,确保对缓冲区的访问是线程安全的。不正确的并发访问可能会导致缓冲区状态不一致,从而影响 bufio.Buffered 的返回值。

  4. 缓冲区类型:确认你使用的是 bufio.Reader 类型的缓冲区,因为 bufio.Bufferedbufio.Reader 的方法。

  5. Go版本:检查你使用的Go语言版本,确保不是由于某个已知但已修复的bug导致的问题。可以通过查阅Go语言的官方发行说明和bug跟踪系统来获取相关信息。

如果以上步骤都无法解决问题,并且你确信这是一个bug,可以考虑在Go语言的官方问题跟踪系统中提交一个issue,并提供详细的代码示例和复现步骤。

回到顶部