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

示例代码
packagemain
import(
"fmt"
"time"
)
typenewFieldstring
func(fnewField)print(){
fmt.Println(f)
}
funcmain(){
data:=[]newField{"one","two","thred"}
for_,v:=rangedata{
gov.print()//printonetwothree
gofunc(){fmt.Println(v)}()//printthreethreethree
}
time.Sleep(3*time.Second)
}
疑问
range过程中,两种打印方式,为什么打印的结果不同呢?
吃鸡游戏
浏览 289回答 2
2回答

德玛西亚99

闭包的问题,v.print()是依次调用的是"one","two","three"的print方法。第二个goroutine引用了循环变量v,goroutine未启动时,v就改变了,所以不一致,但是不一定是three,three,three,与运行时的调度有关

Smart猫小萌

经典的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"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript