![[红脸]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_63.c32f5b5.png)
名的硬核大佬 Russ Cox 表示他一直在研究这个问题,并表示十年的经验表明了当前语义的代价是很大的。
问题
案例一:取地址符
在 Go 语言中,我们写 for 语句时有时会出现运行和猜想的结果不一致。例如以下第一个案例的代码:
var all []*Item
for _, item := range items {
all = append(all, &item)
}
这段代码有问题吗?变量 all 内的 item 变量,存储进去的是什么? 是每次循环的 item 值吗?
实际上在 for 循环时,每次存入变量 all 的都是相同的 item,也就是最后一个循环的 item 值。
这是 Go 面试里经常出现的题目,结合 goroutine 更风骚,毕竟还会存在乱序输出等问题。
如果你想解决这个问题,就需要把程序改写成如
问题
案例一:取地址符
在 Go 语言中,我们写 for 语句时有时会出现运行和猜想的结果不一致。例如以下第一个案例的代码:
var all []*Item
for _, item := range items {
all = append(all, &item)
}
这段代码有问题吗?变量 all 内的 item 变量,存储进去的是什么? 是每次循环的 item 值吗?
实际上在 for 循环时,每次存入变量 all 的都是相同的 item,也就是最后一个循环的 item 值。
这是 Go 面试里经常出现的题目,结合 goroutine 更风骚,毕竟还会存在乱序输出等问题。
如果你想解决这个问题,就需要把程序改写成如
展开
评论
点赞