Golang中的匿名函数(闭包)

Posted gardenofhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang中的匿名函数(闭包)相关的知识,希望对你有一定的参考价值。

GO语言的匿名函数就是闭包,以下是《GO语言编程》中对闭包的解释

 基本概念
闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者
任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含
在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环
境(作用域)。
 闭包的价值
闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示
数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到
变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

 

重点来了,先看一段代码:

package main
import "fmt"

func adder() func(int) int{
    fmt.Println("this line exec")
    sum := 0
    return func(x int) int{
        fmt.Println("sum  = ",sum)
        sum += x
        return sum
    }
}

func main(){
    pos , neg := adder(),adder()
    for i:=0 ; i< 4; i++ {
        fmt.Println(pos(i),neg(-2*i))
    }
}

执行结果如下:

this line exec
this line exec
sum = 0
sum = 0
0 0
sum = 0
sum = 0
1 -2
sum = 1
sum = -2
3 -6
sum = 3
sum = -6
6 -12

-----------------------------

从打印中可以看出,对于闭包而言,重要的是返回的匿名函数,对于在代码区域内的闭包,其闭包内的变量是未销毁的,这也是sum的变量值保存的原因,而且,sum = 0只是执行了一次。这也就是说,对于闭包而言,其初始化一次后,匿名函数内的变量就一直不被销毁(代码区域内),每次执行闭包,闭包内的变量有保存了上一次运行后的值。所以,看下边代码:

func adder() func(int) int{
    fmt.Println("this line exec")
    sum := 0
    return func(x int) int{
        fmt.Println("sum  = ",sum)
        sum += x
        return sum
    }
}

func main(){
    pos := adder()
    for i:=0 ; i< 4; i++ {
        fmt.Println(pos(1))
    }
}

结果是:

this line exec
sum = 0
1
sum = 1
2
sum = 2
3
sum = 3
4

可以更清晰的了解。






























以上是关于Golang中的匿名函数(闭包)的主要内容,如果未能解决你的问题,请参考以下文章

Golang之匿名函数和闭包

Golang基础_06-函数function

Golang basic_leaming函数详解

Golang basic_leaming函数详解

[Golang]函数详解

javascript 匿名函数及闭包----转载