所謂閉包就是一個函數“捕獲”了和它在同一作用域的其它常量和變量。這就意味着當閉包被調用的時候,不管在程序什么地方調用,閉包能夠使用這些常量或者變量。它不關心這些捕獲了的變量和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變量就還會存在。
1、閉包的特點
示例1: 函數調用完畢,x自動釋放
package main //必須
import "fmt"
func test01() int {
//函數被調用時,x才分配空間,才初始化為0
var x int //沒有初始化,值為0
x++
return x * x //函數調用完畢,x自動釋放
}
func main() {
fmt.Println(test01())
fmt.Println(test01())
fmt.Println(test01())
fmt.Println(test01())
}
執行結果:
1 1 1 1
2、閉包的特點 (備注:變量不會釋放,還會存在)
//返回值為一個匿名函數,返回一個函數類型,通過f來調用返回的匿名函數,f來調用閉包函數
//它不關心這些捕獲了的變量和常量是否已經超出了作用域
//所以只有閉包還在使用它,這些變量就還會存在。
示例2:
package main //必須
import "fmt"
//函數的返回值是一個匿名函數,返回一個函數類型
func test02() func() int {
var x int //沒有初始化,值為0
return func() int {
x++
return x * x
}
}
func main() {
//返回值為一個匿名函數,返回一個函數類型,通過f來調用返回的匿名函數,f來調用閉包函數
//它不關心這些捕獲了的變量和常量是否已經超出了作用域
//所以只有閉包還在使用它,這些變量就還會存在。
f := test02()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
}
執行結果:
1 4 9 16 25
