fmt打印不显示 go_golang 你所不知道的 log 和 fmt

直接点说,就是由于fmt 是线程不安全的, 如果你在多协程场景下使用fmt打印信息可能会得到乱序的结果 就是说 不按代码里的顺序打印.

下面看示例

代码示例

golang fmt 多线程 乱序:

func main() {

wg := sync.WaitGroup{}

wg.Add(10)

var arr []int

for i:=0;i<10;i++ {

go func(i int) {

defer wg.Done()

arr = append(arr, i)

log.Printf("i: %d",i)

}(i)

}

wg.Wait() // 隔离

s :=0

for _, v := range arr{

fmt.Println(v)

s += v

}

log.Println(s)

}

输出结果是这样的:

2019/09/16 20:54:22 i: 2

2

2019/09/16 20:54:22 i: 4

4

2019/09/16 20:54:22 i: 0

8

2019/09/16 20:54:22 i: 8

7

2019/09/16 20:54:22 i: 6

2019/09/16 20:54:22 40

虽然有wait 隔离了协程的执行,但 fmt 还是导致了乱序. 和普通的多线程问题还不太一样.

这个我和同事研究了一下,有可能 是因为log 有个输出的buffer,wait之前的逻辑 只能确保信息输出到buffer,之后log 和fmt 竞争std.out. 所以交叉输出.

最后

最后,打印信息的话 一般也不用fmt,fmt一般用来格式化. 所以没啥奇葩需求也就不要用fmt了.

有疑问加站长微信联系(非本文作者)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值