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
}