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 |
分类:
Go专题精讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具