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

求大佬指点哈!golang中range问题怎么回事哈啊?

求大佬指点哈!golang中range问题怎么回事哈啊?

动漫人物 2019-09-25 16:30:27
示例代码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贡献1820条经验 获得超10个赞

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

TA贡献1886条经验 获得超2个赞

经典的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-09-25
  • 2 回答
  • 0 关注
  • 279 浏览
慕课专栏
更多

添加回答

举报

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