匿名函數: 沒有函數名的函數
基本概念
閉包是能夠包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內或者
任何全局上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(因爲自由變量包含
在代碼塊中,因此這些自由變量以及它們引用的對象沒有被釋放)爲自由變量提供綁定的計算環
境(做用域)。
閉包的價值
閉包的價值在於能夠做爲函數對象或者匿名函數,對於類型系統而言,這意味着不只要表示
數據還要表示代碼。支持閉包的多數語言都將函數做爲第一級對象,就是說這些函數能夠存儲到
變量中做爲參數傳遞給其餘函數,最重要的是可以被函數動態建立和返回。閉包
package main import ( "fmt" ) func main() { a := 10 str := "make" //匿名函數,沒有函數名字,函數定義,尚未調用 f1 := func() { fmt.Println("a=",a) fmt.Println("str=",str) } f1() // 給一個函數類型起別名 type FuncType func() // 函數沒有參數,沒有返回值 // 聲明變量 var f2 FuncType f2 = f1 f2() //定義匿名函數,同時調用 func() { fmt.Printf("a=%d,str=%s\n", a,str) }() // 後面的()表明調用匿名函數 // 帶參數的匿名函數 f3 := func(i,j int) { fmt.Printf("i =%d, j=%d\n",i,j) } f3(1,2) //定義匿名函數,同時調用 func(i, j int) { fmt.Printf("i=%d,j=%d\n", a,j) }(10,20) // 後面的()表明調用匿名函數 //匿名函數,有參數有返回值 x,y := func(i, j int) (max, min int){ if i > j{ return i,j }else { return j,i } }(10,20) fmt.Println(x,y) }
package main import "fmt" func test01() func() int { var x int // 沒有初始化, 值爲0 return func() int { x++ return x * x } } func test02() int { var x int x++ return x *x } func main() { // 返回值爲一個匿名函數,返回一個函數類型,經過f來調用返回的匿名函數 // 它不關心這些捕獲了的變量和常量是否超出了做用域 // 因此只要閉包還在使用它,這些變量就還會存在 f := test01() fmt.Println(f()) //1 fmt.Println(f()) //4 fmt.Println(f()) //9 fmt.Println(f()) //16 // 用完就釋放了,每次調用仍是1 fmt.Println(test02()) fmt.Println(test02()) fmt.Println(test02()) }