1. 程式人生 > >Go/函式/匿名函式-閉包

Go/函式/匿名函式-閉包

## 匿名函式作為一個閉包,閉包以引用傳遞的方式捕獲外部變數

package main

import "fmt"

func test(){
	a := 22
	str := "go"

	//匿名函式,閉包 以引用傳遞方式捕獲外部變數
	func(){
		a = 23
		str = "gogo"
		fmt.Println(a,str)
	}() //直接呼叫匿名函式

	fmt.Println(a,str)
}

func main() {
	a := 33

	//定義匿名函式
	f1 := func(){
		fmt.Printf("訪問匿名函式作用域之外的變數//閉包//,a=%d \n",a);
	}
	f1() //呼叫匿名函式

	type FuncType func ()
	var f2 FuncType = f1
	f2()

	//定義並直接呼叫匿名函式
	func(){
		fmt.Printf("訪問匿名函式作用域之外的變數//閉包//,a=%d \n",a);
	}()

	x,y := func (i,j int) (c,d int){
		c = i+a
		d = j+a
		return
	}(1,2)
	fmt.Println(x,y)

	test()
}

##  閉包可以作為函式返回值  閉包離開作用域,其捕獲的外部變數才會銷燬

package main

import "fmt"

//返回值為匿名函式
func test() func () int {
	var i int 			//預設值0
	return func() int{
		i++
		return i*i
	}
}

func main() {
	f := test()			//f為一個匿名函式
	fmt.Println(f())	        //1*1
	fmt.Println(f())	        //2*2
	fmt.Println(f())	        //3*3
	//只有閉包f離開作用域main,其捕獲的變數i才會銷燬
}