使用bufio Writer时,手动调用Flush()的必要性

go 复制代码
package main

import (
	"bytes"
	"bufio"
	"fmt"
)

func main() {
	buf := &bytes.Buffer{}

	wr := bufio.NewWriter(buf)
	wr.Write([]byte("1234"))

	fmt.Println("buf:", buf.String())
}

  内容没有写到buf:

go 复制代码
go run iotest.go
buf:

  添加Flush:

css 复制代码
package main

import (
	"bytes"
	"bufio"
	"fmt"
)

func main() {
	buf := &bytes.Buffer{}

	wr := bufio.NewWriter(buf)
	wr.Write([]byte("1234"))
	wr.Flush()

	fmt.Println("buf:", buf.String())
}

  输出:

go 复制代码
go run iotest.go
buf: 1234

  查看这块的源码:

可以看到,只有在buffer写满(默认4KB)后,才会主动调Flush()把buffer内容写入底层io。或者写入的数据很大超过buffer长度,会直接写入底层io。

所以,使用bufio Writer时,在适当位置手动调用Flush()才比较稳妥。

【迁移】www.cnblogs.com/zxq89/p/167... posted @ 2022-09-28 11:19

相关推荐
tyung3 小时前
znet 数据编解码:字节流怎么变成消息
后端·网络协议·go
leeyi5 小时前
数据库迁移不翻车:golang-migrate 实战,143 个 DDL 有序执行(第97篇-E83)
go·aigc·agent
用户330144867637 小时前
mheap:全局堆管理器
go
用户330144867637 小时前
10. Large 对象分配:直接路径
go
yinchnag7 小时前
CRTP:奇异递归模板模式在 Go 模块系统中的实现
设计模式·go
ylj_dev1 天前
从 0 构建 AI Workload Platform(七):可观测性、故障注入与性能验证
go·prometheus·可观测性·opentelemetry·故障注入
我的div丢了肿么办1 天前
go语言中基本数据类型的转换
后端·go
newerp2 天前
语法分析与 AST:Parser 与 go/ast
后端·程序员·go
newerp2 天前
Go 编译过程全景
后端·程序员·go
stark张宇3 天前
Go语言runtime全景图:从编译到GC,带你彻底吃透Go的底层血脉
后端·go