1. 程式人生 > >go語音基礎之閉包的特點

go語音基礎之閉包的特點

       所謂閉包就是一個函式“捕獲”了和它在同一作用域的其它常量和變數。這就意味著當閉包被呼叫的時候,不管在程式什麼地方呼叫,閉包能夠使用這些常量或者變數。它不關心這些捕獲了的變數和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變數就還會存在。

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