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
posted @ 2022-05-17 00:50  左扬  阅读(179)  评论(0编辑  收藏  举报
levels of contents