如何解决将参数传递给函数闭包
使用闭包与使用函数参数之间的区别在于共享同一变量与获取值的副本有关。请考虑下面的两个示例。
在 Closure中, 所有函数调用都将使用中存储的值i
。在任何goroutines有时间打印它的值之前,该值很可能已经达到3。
在“ 参数” 示例中,每个函数调用都将传递进行i
调用时的值的副本,从而为我们提供我们更可能需要的结果:
for i := 0; i < 3; i++ {
go func() {
fmt.Println(i)
}()
}
结果:
3 3 3
for i := 0; i < 3; i++ {
go func(v int) {
fmt.Println(v)
}(i)
}
结果:
0 1 2
http //play.golang.org/p/T5rHrIKrQv
解决方法
我试图了解Go在创建带有参数的匿名函数与将该函数用作闭包之间的区别。这是区别的一个例子。
带参数:
func main() {
done := make(chan bool,1)
go func(c chan bool) {
time.Sleep(50 * time.Millisecond)
c <- true
}(done)
<-done
}
作为关闭:
func main() {
done := make(chan bool,1)
go func() {
time.Sleep(50 * time.Millisecond)
done <- true
}()
<-done
}
我的问题是,第一种形式何时比第二种更好?您是否会为此类事情使用参数?我唯一看到第一种形式有用的是func(x,y)
从另一个函数返回a时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。