GO語言基礎語法之函數閉包(第十二天)

Go 語言支持匿名函數,可作爲閉包。
從匿名函數角度:

  1. 優越性在於可以直接使用函數內的變量,不必申明
  2. 動態創建的特性,該特性使得匿名函數不用通過參數傳遞的方式,就可以直接引用外部的變量。

其實理解閉包的類似看成C++中的一個類,一個閉包函數調用就是實例化一個類。
根據類的角度看出哪些是“全局變量”,哪些是“局部變量”
函數返回結果分別實例化了“閉包類”,在這個“閉包類”中有個“閉包全局變量”。
一個函數和與其相關的引用環境組合而成的實體。

package main

import (
	"fmt"
	"unsafe"
)

func getSequence() func() int {
	i:=0
	return func() int {
		i+=1
		return i
	}
}

func main(){
	/* nextNumber 爲一個函數,函數 i 爲 0 */
	/* nextNumber 爲一個函數,函數 i 爲 0 */
	nextNumber := getSequence()
    fmt.Println("####netNumber",unsafe.Pointer(&nextNumber))
	/* 調用 nextNumber 函數,i 變量自增 1 並返回 */
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())
	fmt.Println(nextNumber())

	/* 創建新的函數 nextNumber1,並查看結果 */
	nextNumber1 := getSequence()
	fmt.Println("######netNumber1",unsafe.Pointer(&nextNumber1))
	fmt.Println(nextNumber1())
	fmt.Println(nextNumber1())
}
####netNumber 0xc000006028
1
2
3
######netNumber1 0xc000006038
1
2

Process finished with exit code 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章