所謂閉包就是一個函數「捕獲」了和它在同一做用域的其它常量和變量。這就意味着當閉包被調用的時候,無論在程序什麼地方調用,閉包可以使用這些常量或者變量。它不關心這些捕獲了的變量和常量是否已經超出了做用域,因此只有閉包還在使用它,這些變量就還會存在。閉包
一、閉包的特色函數
示例1: 函數調用完畢,x自動釋放spa
package main //必須 code import "fmt" ci func test01() int { 作用域 //函數被調用時,x才分配空間,才初始化爲0 table var x int //沒有初始化,值爲0 class x++ test return x * x //函數調用完畢,x自動釋放 import } func main() { fmt.Println(test01()) fmt.Println(test01()) fmt.Println(test01()) fmt.Println(test01()) } |
執行結果:
二、閉包的特色 (備註:變量不會釋放,還會存在)
//返回值爲一個匿名函數,返回一個函數類型,經過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()) } |
執行結果: