go語音基礎之閉包的特點
阿新 • • 發佈:2019-01-07
所謂閉包就是一個函式“捕獲”了和它在同一作用域的其它常量和變數。這就意味著當閉包被呼叫的時候,不管在程式什麼地方呼叫,閉包能夠使用這些常量或者變數。它不關心這些捕獲了的變數和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變數就還會存在。
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