什么是闭包

“一等公民”意味着函数可以像普通的类型(整型、字符串等)一样进行赋值、作为函数的参数传递、作为函数的返回值等。Golang的函数只能返回匿名函数!

示例:

  1. var f = func(int) {}
  2. func main() {
  3. f = func(i int) {
  4. fmt.Println(i)
  5. }
  6. f(2)
  7. f = func(i int) {
  8. fmt.Println(i * i * i)
  9. }
  10. f(2)
  11. }
  12. /*
  13. 输出:
  14. 2
  15. 8
  16. */
闭包陷阱
  1. func main(){
  2. for i :=0;i<3;i++{
  3. go func(){
  4. fmt.Println(i) //函数内引用函数外部的变量,使外部变量的生命周期延长了
  5. }()
  6. }
  7. }

执行结果:

  1. 3
  2. 3
  3. 3
正确的方式是向匿名函数中传递参数
  1. func main(){
  2. for i :=0;i<3;i++{
  3. go func(i int){
  4. fmt.Println(i) //函数内引用函数外部的变量,使外部变量的生命周期延长了
  5. }(i)
  6. }
  7. }
文档更新时间: 2021-08-21 14:26   作者:张尚