Golang中Bytes、bufio和flate包的使用问题排查

Golang中Bytes、bufio和flate包的使用问题排查 大家好,

Go语言对我来说还很陌生……这段代码本应记录表示字符串字节的非空值。为什么它记录的是空字符串?

var b bytes.Buffer
bufioW := bufio.NewWriter(&b)
flateW, err := flate.NewWriter(bufioW, flate.NoCompression)
flateW.Write([]byte("This is a test"))
flateW.Close()
log.Println("SAML Request after compression: ", b.Bytes())

谢谢。


更多关于Golang中Bytes、bufio和flate包的使用问题排查的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你好,

如果在日志语句之前调用 bufioW.Flush(),应该就能解决问题了。

更多关于Golang中Bytes、bufio和flate包的使用问题排查的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题出在 bufio.Writer 的缓冲区未刷新。flate.Writer 在调用 Close() 时会刷新自身,但数据仍停留在 bufio.Writer 的缓冲区中,未写入底层的 bytes.Buffer

以下是修复后的代码:

var b bytes.Buffer
bufioW := bufio.NewWriter(&b)
flateW, err := flate.NewWriter(bufioW, flate.NoCompression)
if err != nil {
    log.Fatal(err)
}
flateW.Write([]byte("This is a test"))
flateW.Close()
bufioW.Flush() // 关键:刷新 bufio.Writer 的缓冲区
log.Println("SAML Request after compression: ", b.Bytes())

或者,更简洁的做法是直接使用 bytes.Buffer 而不通过 bufio.Writer

var b bytes.Buffer
flateW, err := flate.NewWriter(&b, flate.NoCompression)
if err != nil {
    log.Fatal(err)
}
flateW.Write([]byte("This is a test"))
flateW.Close()
log.Println("SAML Request after compression: ", b.Bytes())

在第一个修复示例中,bufioW.Flush() 确保所有缓冲数据写入 b。第二个示例避免了额外的缓冲层,直接使用 bytes.Buffer 作为 flate.Writer 的目标。

回到顶部