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 的目标。

