小编典典

将参数传递给函数闭包

go

我试图了解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时。


阅读 244

收藏
2020-07-02

共1个答案

小编典典

使用闭包与使用函数参数之间的区别在于共享同一变量与获取值的副本有关。请考虑下面的两个示例。

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

2020-07-02