Go语言闭包

270 阅读1分钟

闭包和匿名函数经常被用作同义词。严格来说,匿名函数就是没有被赋予名称的函数,而闭包实际上是一个函数实例,也就是说它是存在于内存里的某个结构体。如果从实现上来看的话,匿名函数如果没有捕捉自由变量,那么它其实可以被实现为一个自由指针,或者直接内联到调用点,如果它捕捉了自由变量那么它将是一个闭包;而闭包则意味着同时包括函数指针和环境两个关键因素。

这段话的意思是闭包是匿名函数的一种实例,包括两样东西:函数指针和环境变量。

举例:

func main() {
   next := getSequence()
   fmt.Println(next()) // 1
   fmt.Println(next()) // 2
   fmt.Println(next()) // 3
   
   next2 := getSequence()
   fmt.Println(next2()) // 1
   fmt.Println(next2()) // 2
}

func getSequence() func() int {
   i := 0
   return func() int {
      i += 1
      return i
   }
}

getSequence()中的i就是被匿名函数捕捉走的自由变量,i本应该结束的生命周期被延长了。

闭包在执行的时候会取到变量最新值。