• 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

    可以更清晰的了解。

  • 相关阅读:
    手动添加 memcached.jar包
    easyui返回数据类型
    负载均衡
    nginx负载均衡
    nginx配置文件详解
    Js操作Select大全(取值、设置选中)
    jQuery select的操作代码
    jQuery对Select操作大集合
    PHP+AJAX无刷新返回天气预报
    一个好用的PHP验证码类
  • 原文地址:https://www.cnblogs.com/gardenofhu/p/9998748.html
Copyright © 2020-2023  润新知