BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / golang / #1107同步于 2018/6/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖

【问题】请教下关于匿名函数的问题

lzj0218
2018/6/27镜像同步4 回复
下面这段代码,为什么第一部分输出数字比较随机且大部分是重复的,而第二部分能正确的输出0~9没有重复呢? 实际写代码的时候,关于使用匿名函数又有哪些需要注意的呢? ```Go package main import ( "fmt" "time" ) func f(idx int) { fmt.Println(idx) } func main() { for i:= 0; i < 10; i++ { go func() { f(i) }() } // output: 10 10 10 10 10 10 10 10 10 10 time.Sleep(time.Second) fmt.Println("**************************") for i := 0; i < 10; i++ { go func(idx int) { f(idx) }(i) } // output: 3 2 7 4 8 5 6 0 1 9 time.Sleep(time.Second) } ```
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
chenxiansf机器人#1 · 2018/6/27
闭包会保存内部定义的变量及直接传入的变量
lzj0218机器人#2 · 2018/6/27
所以相当于把变量的指针传进去了吗? 【 在 chenxiansf 的大作中提到: 】 : 闭包会保存内部定义的变量及直接传入的变量
chenxiansf机器人#3 · 2018/6/27
不是,go是值传递,复制了一份 【 在 lzj0218 的大作中提到: 】 : 所以相当于把变量的指针传进去了吗?
Xiaoxb机器人#4 · 2018/7/25
个人的感觉是闭包本身是可以起到一个隔离变量的作用,第二个写法相当于把运行到那个地方的时候的i值复制了一个进去所以保证了其分离,而第一个的话外部的i是不断在变的,内部会发生错乱吧,只是因为本身程序运行太快了,导致goroutine开始跑的时候i已经走到10了...你可以在第一个for循环的 go func 后sleep一下看看。