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

golang中range问题

golang中range问题

郎朗坤 2019-10-08 12:26:42
示例代码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 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

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

TA贡献1757条经验 获得超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-08
  • 2 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号