go 匿名函数与闭包
来源:原创
时间:2019-02-25
作者:脚本小站
分类:GoLang
package main import "fmt" func main() { // 匿名函数 f1 := func() { fmt.Println("aaa") } f1() // 闭包 func() { fmt.Println("bbb") }() // 带参数匿名函数 f2 := func(a int) { fmt.Println(a) } f2(32) // 定义匿名函数并调用 func(i, j int) { fmt.Printf("%d -- %d\n", i, j) }(10, 20) f3 := func(i, j int) (result int) { result = i * j return }(10, 20) fmt.Println(f3) }
闭包捕获外部变量的特点:
闭包捕获同一个作用域的常量和变量,不管是否超出了作用域,闭包被调用变量就还会存在。闭包放在一个独立的空间,并没有释放。
package main import "fmt" func main() { a := 10 b := "string" func() { // 闭包以引用的方式捕获外部变量 a = 20 b = "STRING" fmt.Printf("a = %d, b = %s\n", a, b) }() // 函数内修改后函数外面也被改了 fmt.Printf("a = %d, b = %s\n", a, b) }
例:
package main import "fmt" // 函数的返回值是一个匿名函数 func test01() func() int { var x int return func() int { x++ return x * x } } func main() { // 返回的是匿名函数 f := test01() fmt.Println(f())//1 fmt.Println(f())//4 fmt.Println(f())//9 fmt.Println(f())//16 }