我尝试使用 net 包的客户端接收服务端的数据。但是我发现 fmt.Printf 和 log.Printf 输出的完全不同。缓冲区我是故意设置为 2 的。我的假设传输的数据为: hello world 求大神指点!感激~
buff := make([]byte, 2)
for {
count, err := this.conn.Read(buff)
if err != nil {
return
}
fmt.Printf("%s", buff[:count]) // hello world
log.Printf("%s", buff[:count]) // he ll o wo rl d
}
有疑问加站长微信联系(非本文作者)

fmt.Printf
是输出到os.Stdout
,它是行缓冲的,而log.Printf
是输出到os.Stderr
,这是无缓冲的。所以有这个差异!我感觉不像是 fmt 与 log 的问题,如果是设置了缓冲区,每次打印不会超过这个值。另外怎么还有 this 这种操作
你可以
log.SetOutput(os.Stdout)
试试,看看结果是不是和fmt.Printf
一样了!PS:
this
应该是它代码内部的,不用关心。原本的 log 默认 out 是 os.Stderr,这个设置我觉得意义不大。你可能是怀疑 os.Stderr 与 os.Stdout 实现的 io.Writer 接口有差异。我建立了一个 tcp 连接的例子来测试,并不知道楼主这个输出怎么来,并且log 输入默认要加换行符的
log.Printf()保证最后有换行符,
A newline is appended if the last character of s is not already a newline
fmt.Printf()传什么就输出什么
那这样的话,我实际 buff 缓存切片里面 一值存储的只有 2 个 字节的数据对吧
fmt.Sprintf
后面自动加了换行可以看这个示例 https://play.golang.org/p/A0l45p9p8O
无非就是log.Printf自动加了换行,fmt.Printf没加,你在fmt.Printf后加一个fmt.println,它们就一样了
你是最佳答案