1 回答
TA贡献1802条经验 获得超5个赞
问题出在这些行上:
for _, ctx := range contexts {
log.Printf("Starting Controller %s.", ctx.Origin)
_ = NewController(&ctx)
}
如语言规范中所述,该变量ctx在循环的每次迭代中重复使用。在循环的每次迭代中传递这个单个变量的地址。程序打印存储在此变量中的最后一个值(虽然不能保证,但变量存在竞争)。NewController
run example that prints &ctx
有几种方法可以解决这个问题。一种方法是将代码更改为:
for i := range contexts {
log.Printf("Starting Controller %s.", context[i].Origin)
_ = NewController(&context[i])
}
run it on the playground
通过此更改,NewController 被传递了一个指向切片元素的指针,而不是函数中指向变量的指针。
另一种选择是在循环体内声明一个新变量:
for _, ctx := range contexts {
ctx := ctx // <-- add this line
log.Printf("Starting Controller %s.", ctx.Origin)
_ = NewController(&ctx)
}
run it on the playground
此选项在循环的每次迭代中分配一个 ctx,而第一个选项则没有。
- 1 回答
- 0 关注
- 147 浏览
添加回答
举报