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

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

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

1
函数+引用环境=闭包

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)
}

  运行后输出如下:

1
2
3
4
5
调用匿名函数前,修改引用前,str 的值:Hello world
匿名函数中,修改 引用前 str 的值:Hello world
匿名函数中,修改 引用后 str 的值:Hello Shanghai
 
调用匿名函数后,修改引用后,str 的值:Hello Shanghai
posted @   左扬  阅读(237)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
levels of contents
点击右上角即可分享
微信分享提示