1. 程式人生 > >go隨聊-閉包

go隨聊-閉包

什麼是閉包

        閉包就是一個匿名函式和一個外部變數(成員變數)組成的一個整體 ,通俗的講就是一個匿名函式中引用了其外部函式內的一個變數而這個變數和這個匿名函式的組合就叫閉包。如下程式碼所示:

func inner() func() int {
	count:=0
	return func() int {
		count++
		return count
	}
}

inner函式中定義一個count變數,同時返回一個func

func Closure() {
	f1:=inner()
	a1:=f1()
	fmt.Println("f1:",a1)
	a2:=f1()
	fmt.Println("f1:",a2)
	a3:=f1()
	fmt.Println("f1:",a3)
}

Closure函式中呼叫inner函式,返回一個f1,然後多次呼叫f1() 會有什麼結果呢 

f1: 1
f1: 2
f1: 3

在閉包中持有該變數的引用 而匿名函式所操作的變數一直是該閉包中的變數的引用,所以多次呼叫f1()函式操作的是同一個變數count,那麼值逐漸增長也就不奇怪了。

如果多次呼叫inner獲取閉包呢,會是什麼情況

func Closure() {
	f1:=inner()
	a1:=f1()
	fmt.Println("f1:",a1)
	a2:=f1()
	fmt.Println("f1:",a2)
	a3:=f1()
	fmt.Println("f1:",a3)

	f2:=inner()
	a1=f2()
	fmt.Println("f2:",a1)
	a2=f2()
	fmt.Println("f2:",a2)
	a3=f2()
	fmt.Println("f2:",a3)
}
f1: 1
f1: 2
f1: 3
f2: 1
f2: 2
f2: 3

所以每個閉包中的引用變數count都是不同的