示例代码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,与运行时的调度有关
Smart猫小萌
TA贡献1911条经验 获得超7个赞
经典的golangfor-range陷阱。Google下就知道了funcmain(){data:=[]newField{"one","two","thred"}for_,v:=rangedata{tmp:=vgofunc(){fmt.Println(tmp)}()gofunc(){fmt.Println("addr:",&v,",value:",v)}()//printthreethreethree}time.Sleep(3*time.Second)}可以运行下这个程序。gov.print()等同于赋值后,再执行Println。“v”的地址一直没变,所以打印出来的都是最后一次的赋值,即"three"
添加回答
举报
0/150
提交
取消