首页 > 其他 > 详细

Golang中的匿名函数(闭包)

时间:2018-11-22 00:53:11      阅读:195      评论:0      收藏:0      [点我收藏+]

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中的匿名函数(闭包)

原文:https://www.cnblogs.com/gardenofhu/p/9998748.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!