闭包和匿名函数经常被用作同义词。严格来说,匿名函数就是没有被赋予名称的函数,而闭包实际上是一个函数实例,也就是说它是存在于内存里的某个结构体。如果从实现上来看的话,匿名函数如果没有捕捉自由变量,那么它其实可以被实现为一个自由指针,或者直接内联到调用点,如果它捕捉了自由变量那么它将是一个闭包;而闭包则意味着同时包括函数指针和环境两个关键因素。
这段话的意思是闭包是匿名函数的一种实例,包括两样东西:函数指针和环境变量。
举例:
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本应该结束的生命周期被延长了。
闭包在执行的时候会取到变量最新值。