for _, cg := range consumers {
log.Logger.Infof("%p", cg)
utils.SafeGo(func() {
log.Logger.Infof("%#v", cg)
log.Logger.Infof("%p", cg)
StartConsumer(ctx, cfg.Endpoint, cfg.AccessKey, cfg.SecretKey, cg)
})
}
输出:
0xc000683540
0xc000683560
&queue.Test2{groupName:"test2"}
&queue.Test2{groupName:"test2"}
0xc000683560
0xc000683560
consumers 包含两个元素,值都是指针。 1.22 版本开始 range 每次不是会创建新变量了吗?为什么我 SafeGo 里面 cg 拿到的还是最后一个的值?
1
fireice 39 天前
用匿名函数的参数传进去就 ok 了
|
3
zealot0630 39 天前 via Android
cg 变量从头到尾都只有一个啊,所有匿名函数捕获的变量都指向这同一个 cg
|
4
pike0002 39 天前 1
检查下 go.mod 里面的 go 的版本,如果是 1.22 之前的话新的特性就不会生效
|
5
dyllen OP @zealot0630 每次循环 cg 变量都是不同的,你看输出的指针地址。
https://go.dev/play/p/kV2gxXfzVfc 你看看整个测试代码,我帖子里面的代码和这个测试的一样的,就除了 slice 的数据类型不同。 |