GO语言--闭包
创始人
2025-05-28 18:35:02
0

闭包

引用外部变量的函数称为闭包,即使离开了引用环境也不会被释放或删除。在闭包中仍然可以继续使用这个变量。

函数+引用环境=闭包

同一个函数,但在不同的引用环境下可以组成不同的闭包。说实话单凭这么几句话很难说清楚,先来看看例子。使用例如下

package mainimport "fmt"func add() func(int) int {x := 10return func(y int) int {x += yreturn x}
}
func tmp(num int) {x := add()(num)fmt.Printf("%v\n", x)
}
func main() {f := add()fmt.Printf("%v\n", f(10))fmt.Printf("%v\n", f(-9))tmp(10)
}

 运行结果为

20
11
20

重点是要把握住每个函数及其变量的生命周期。

在上面这段代码中,我们先来看看这个返回值为func(int) int(相当于一个数据类型为“函数”的变量)的add()函数。可以看到在add()函数中,最后返回的是另一个函数的返回值。同时我们定义了一个值为10的变量x, 并在返回值处定义了一个匿名函数作为参数。

此时,add()函数就形成了一个闭包,它内部有一个变量x和一个引用了变量x的匿名函数。变量x对于这个匿名函数来说便属于外部变量。所以在add()的生命周期内,变量x会一直有效。

于是我们先向add中传入10,在经过匿名函数的处理后,x的值已经变成了20。

再看看主函数,我们将add()的返回值赋给了f然后打印输出。但需要注意的是,add()函数并没有在执行完第一条函数时就释放它的变量x。

fmt.Printf("%v\n", f(10))
fmt.Printf("%v\n", f(-9))

还记得add()函数的返回值是什么类型吗?如果你去查看此时f的类型你就会发现它的返回值是func(int) int类型。相当于f也是一个函数,这相当于用f去调用add()里的匿名函数。

这导致add()里的变量的生命周期和f的生命周期是一样的--一直到main函数结束。

fmt.Printf("%T\n", f)//运行结果为
//func(int) int

但对于tmp()函数来说就不一样了,tmp调用add()中匿名函数的生命周期只到tmp函数本身结束。所以其结果与f无关。

还是不理解?还是这段代码,但我们修改下tmp和f出现的位置。

package mainimport "fmt"func add() func(int) int {x := 10return func(y int) int {x += yreturn x}
}
func tmp(num int) {x := add()(num)fmt.Printf("%v\n", x)
}
func main() {f := add()fmt.Printf("%v\n", f(10))tmp(10)fmt.Printf("%v\n", f(-9))}

运行结果为

20
20
11 

 从运行结果我们可以看到tmp调用的add()中的变量x和f调用的add()中变量x无关。

 那如果我们给tmp函数添加一个int类型的返回值呢?在main函数中将这个返回值赋给另一个值呢?add()中的变量x还会一直有效吗?

package mainimport "fmt"func add() func(int) int {x := 10return func(y int) int {x += yreturn x}
}
func tmp(num int) int {x := add()(num)return x
}
func main() {c := tmp(10)fmt.Printf("%v\n", c)c = tmp(9)fmt.Printf("%v\n", c)
}

运行结果为

20
19

答案是不会,x的生命周期还是到tmp函数结束而结束。除非你把返回值改为函数类型的变量,让add()内部的匿名函数的生命周期随着main函数中的变量c,一直持续到main函数执行完而结束。

相关内容

热门资讯

新年年会策划方案 最新年会策划方案推荐度:年会策划方案推荐度:公司年会策划方案推荐度:年会策划方案推荐度:年会晚会策划...
药品活动策划方案 药品活动策划方案  为保障活动顺利开展,常常需要提前准备一份具体、详细、针对性强的活动方案,活动方案...
新闻媒体的策划书 新闻媒体推荐的策划书  一、前言。  现代广告的迅猛发展,已成为社会经济增长的一大优势。广告收入增长...
主题活动策划 主题活动策划15篇主题活动策划1  泼水节是傣族人民最盛大的节日,傣语称“桑康比迈”,意为六月(傣历...
运动会活动策划方案 运动会活动策划方案(精选6篇)  为确保活动顺利开展,时常需要预先开展活动方案准备工作,活动方案是阐...
真相永远只有一个“推理之绊”... 真相永远只有一个“推理之绊”系列活动策划  一、活动背景:  “真相永远只有一个”,“ 除所有不可能...
学校总务主任述职报告   述职报告是各级机关、企事业单位和社会团体的工作人员向本单位的组织部门、上级领导机关或本单位员工陈...
万圣节朋友圈必备简短文案 万圣节朋友圈必备简短文案  在日常学习、工作或生活中,越来越多人会在闲暇时发表文案,文案用以展现自己...
母亲节发朋友圈的文案 关于母亲节发朋友圈的文案(精选390句)  随着社交平台的兴起,越来越多人青睐于在社交平台上发表文案...
萝岗区及黄埔区公交线网规划方... 萝岗区及黄埔区公交线网规划方案起止点经行路段萝岗演艺中心-联和开创大道、香雪路、水西路、开创大道、广...
天津工程职业技术学院就业质量... 天津工程职业技术学院就业质量年度报告  一、学院概况  天津工程职业技术学院是一所以工科为主的全日制...
酒店圣诞晚会活动策划方案 酒店圣诞晚会活动策划方案  为了确保事情或工作能无误进行,预先制定方案是必不可少的,方案的内容多是上...
商务谈判策划书 商务谈判策划书  一、什么是策划书  策划书即对某个未来的活动或者事件进行策划,并展现给读者的文本;...
新生迎新策划方案 2021新生迎新策划方案范文  为了确保我们的努力取得实效,时常需要预先开展方案准备工作,方案是从目...
有创意的生日策划方案 有创意的生日策划方案大全(通用8篇)  生日活动的举办,可以促进公司职员工的内部凝聚力和亲和力,加强...
大学生村官工作总结报告 2018年大学生村官工作总结报告范文  从20xx年11月16日来龙阳镇店子村工作,不觉间已过一月之...
实训报告 实训报告范文合集(通用12篇)  实训报告是指包含实训目的、实训环境、实训原理、实训过程、实训结果、...
自我成长的分析报告 自我成长的分析报告(精选11篇)  在现在社会,报告使用的频率越来越高,不同的报告内容同样也是不同的...
企业账户服务自查报告 企业账户服务自查报告范文  时间稍纵即逝,辛苦的工作已经告一段落了,回顾这一段时间存在的工作问题,是...