为了账号安全,请及时绑定邮箱和手机立即绑定

有没有童鞋遇到过同样的问题:golang中range问题求指导!

有没有童鞋遇到过同样的问题:golang中range问题求指导!

吃鸡游戏 2019-10-17 09:40:22
示例代码packagemainimport("fmt""time")typenewFieldstringfunc(fnewField)print(){fmt.Println(f)}funcmain(){data:=[]newField{"one","two","thred"}for_,v:=rangedata{gov.print()//printonetwothreegofunc(){fmt.Println(v)}()//printthreethreethree}time.Sleep(3*time.Second)}疑问range过程中,两种打印方式,为什么打印的结果不同呢?
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

闭包的问题,v.print()是依次调用的是"one","two","three"的print方法。第二个goroutine引用了循环变量v,goroutine未启动时,v就改变了,所以不一致,但是不一定是three,three,three,与运行时的调度有关
                            
查看完整回答
反对 回复 2019-10-17
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

经典的golangfor-range陷阱。Google下就知道了
funcmain(){
data:=[]newField{"one","two","thred"}
for_,v:=rangedata{
tmp:=v
gofunc(){fmt.Println(tmp)}()
gofunc(){fmt.Println("addr:",&v,",value:",v)}()//printthreethreethree
}
time.Sleep(3*time.Second)
}
可以运行下这个程序。gov.print()等同于赋值后,再执行Println。“v”的地址一直没变,所以打印出来的都是最后一次的赋值,即"three"
                            
查看完整回答
反对 回复 2019-10-17
  • 2 回答
  • 0 关注
  • 288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信