1. 程式人生 > >GoLang學習筆記(十三)閉包的定義及用法

GoLang學習筆記(十三)閉包的定義及用法

其實匿名函式就是閉包

寫一個不使用閉包的實現的計數器

func add1() {
	val := 0
	for i := 0; i < 10; i++ {
		fmt.Printf("i=%d \t", i)
		val += add2(i)
		fmt.Println(val)
	}
	fmt.Println("總和為:", val)
}

func add2(x int) int {
	sum := 0
	sum += x
	return sum
}

當執行add1()函式的時候,會給出結果

i=0 	0
i=1 	1
i=2 	3
i=3 	6
i=4 	10
i=5 	15
i=6 	21
i=7 	28
i=8 	36
i=9 	45
總和為: 45

記錄了計數併疊加的結果。

對比一下,再寫一個使用閉包的計數器,並和上面的輸出結果一致

func adder1() {
	result := adder2()
	for i := 0; i < 10; i++ {
		fmt.Printf("i=%d \t", i)
		fmt.Println(result(i))
	}
}

func adder2() func(int) int {
	sum := 0
	result := func(num int) int {
		sum += num
		return sum
	}
	return result
}

最後來寫另外一個閉包計數器,當每次呼叫方法時,計數器加1。

func counter1() {
	res := counter2()
	fmt.Printf("%T \n", res)
	fmt.Println("res:", res)   
	fmt.Println("res:", res()) 
	fmt.Println("res:", res()) 
	fmt.Println("res:", res()) 
}

func counter2() func() int {
	i := 0
	res := func() int {
		i++
		return i
	}
	return res
}

當執行counter1()函式裡的res()一次,計數器加1一次,所以輸出的結果第一行就是res的資料型別,第二行就是res的記憶體地址,第三行為1,第四行為2,第五行為3……以此類推。

func() int 
res: 0x490070
res: 1
res: 2
res: 3