1、go的匿名函數,
//匿名函數,就是函數不帶函數名字呢!func(int)(int) //閉包通過匿名函數實現 func OFFBag() { a, str := 10, "閉包" //匿名函數定義,形成一個閉包,函數里面可以使用變量a和Str f1 := func() { //自動推導 fmt.Println("a= ", a) fmt.Println("str= ", str) } //調用f1() f1() //第二種調用方式,少用 type FuncType func() //定義函數類型 var f2 FuncType = f1 //聲明變量 f2() //第三種調用方式,聲明同時調用 func() { //自動推導 fmt.Println("a= ", a) fmt.Println("str= ", str) }() //圓括號代表調用匿名函數 //帶參數的匿名函數 func(i, j int32) { //自動推導 fmt.Println("i= ", i) fmt.Println("j= ", j) }(10, 20) //圓括號代表調用匿名函數 //有參數有返回值的匿名函數 max, _ := func(i, j int32) (max, min int32) { //自動推導 if i > j { return i, j } return j, i }(10, 20) //圓括號代表調用匿名函數 fmt.Println("max= ", max) }
2、閉包捕獲外部變量,他不關心這些捕獲的變量或常量是否超出作用域,所以只有閉包還在使用這些變量就會存在
func main() { //聲明並賦值變量 str := "閉包的特點" fmt.Println("", str) f := test1() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) } //函數的返回值是一個匿名函數,返回一個函數類型 func test1() func() int32 { var x int32 return func() int32 { x++ return x * x }
輸出結果:用來初始化一些全局變量
3、