• Go从入门到精通——闭包(Closure)——引用了外部变量的匿名函数


    闭包(Closure)——引用了外部变量的匿名函数

      闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量。因此,简单的说:

      函数+引用环境=闭包
    

      同一个函数与不同引用环境组合,可以形成不同的实例,如下图:

      一个函数类型就像结构体一样,可以被实例化。

      函数本身不存储任何信息,只有与利用环境结合形成的闭包才具有 “记忆性”。

      函数是编译器静态的概念,而闭包是运行动态的概念。

    闭包(Closure)在某些编程语言中也被称为 Lambda 表达式。

    在闭包内部修改引用的变量

      闭包对它作用域上部变量的引用可以进行修改,修改引用的变量就会对变量进行实际修改,代码如下:

    package main
    
    import ("fmt")
    
    
    func main(){
    //准备一个字符串
    str := "Hello world"
    
    //创建一个匿名函数
    foo := func(){
         
    	fmt.Printf("匿名函数中,修改 引用前 str 的值:%s\n",str)
        //匿名函数中访问 str
        str = "Hello Shanghai\n"
    	fmt.Printf("匿名函数中,修改 引用后 str 的值:%s\n",str)
    }
    
    fmt.Printf("调用匿名函数前,修改引用前,str 的值:%s\n",str)
    //调用匿名函数
    foo()
    fmt.Printf("调用匿名函数后,修改引用后,str 的值:%s\n",str)
    }

      运行后输出如下:

    调用匿名函数前,修改引用前,str 的值:Hello world
    匿名函数中,修改 引用前 str 的值:Hello world
    匿名函数中,修改 引用后 str 的值:Hello Shanghai
    
    调用匿名函数后,修改引用后,str 的值:Hello Shanghai
  • 相关阅读:
    去除文本多余空行
    自定义裁剪图片
    遍历文件目录下所有图片并保存到统一路径
    根据节点解析xml
    坐标转换——GCJ-02
    获取进程列表
    判断进程状态
    VSDK modify HDMI resolution
    mcspi
    TI RTOS
  • 原文地址:https://www.cnblogs.com/zuoyang/p/16279257.html
Copyright © 2020-2023  润新知