go查看切片地址_Go踩坑笔记(九)

下面代码输出什么?
func main() {
 list := []string{"pi", "big", "star"}

 for _, l := range list {
  go func() {
   fmt.Print(l)
  }()
 }
 time.Sleep(1 * time.Second)
}
7dad160933d1439c6eb8095c4c12298f.gif

长按查看答案:starstarstar

for range创建了每个元素的副本,而不是直接返回每个元素的引用,在迭代时,返回的变量是一个迭代过程中根据切片依次赋值的新变量,所以它的值的地址其实是同一个,这也就导致当for循环结束后,其 l 的地址的值已经被改成 star 了,这也就导致后面goroutine中输出的都是 star

解决方案有两个: 1是重新赋值, 2是将值传递给goroutine中,这里更推荐使用方案2

方案1

func main() {
 list := []string{"pi", "big", "star"}

 for _, l := range list {
  l := l // l 是一个新地址
  go func() {
   fmt.Print(l)
  }()
 }
 time.Sleep(1 * time.Second)
}

方案2

func main() {
 list := []string{"pi", "big", "star"}

 for _, l := range list {
  go func(l string) {
   fmt.Print(l)
  }(l)
 }
 time.Sleep(1 * time.Second)
}

PS: 投稿专道已经开启,欢迎大家踊跃投稿啊(基本只要投就会被选中喔~)

往期推荐

  • Go踩坑笔记(四)

  • Go踩坑笔记(五)

  • Go踩坑笔记(六)

  • Go踩坑笔记(七)

  • Go踩坑笔记(八)

  • Go写一个内网穿透工具

58908575d8cea089f5e793760542178b.png扫码关注 e7cb4aa48a1309c182469399ba265c14.png更多精彩 e89c0d23b1b985a83d489d39dffacbc5.png e89c0d23b1b985a83d489d39dffacbc5.png

你点的每一个在看,我都认真当成了喜欢

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值