C语言闭包学习通

闭包\n引用外部变量的函数称为闭包,即使离开了引用环境也不会被释放或删除。在闭包中仍然可以继续使用这个变量。\n\n函数+引用环境=闭包\n\n同一个函数,但在不同的引用环境下可以组成不同的闭包。说实话单凭这么几句话很难说清楚,先来看看例子。使用例如下\n\npackage main\n \nimport \"fmt\"\n \nfunc add() func(int) int {\n\tx := 10\n\treturn func(y int) int {\n\t\tx += y\n\t\treturn x\n\t}\n}\nfunc tmp(num int) {\n\tx := add()(num)\n\tfmt.Printf(\"%v\\n\", x)\n}\nfunc main() {\n\tf := add()\n\tfmt.Printf(\"%v\\n\", f(10))\n\tfmt.Printf(\"%v\\n\", f(-9))\n\ttmp(10)\n}\n 运行结果为\n\n20\n11\n20\n\n重点是要把握住每个函数及其变量的生命周期。\n\n在上面这段代码中,我们先来看看这个返回值为func(int) int(相当于一个数据类型为“函数”的变量)的add()函数。可以看到在add()函数中,最后返回的是另一个函数的返回值。同时我们定义了一个值为10的变量x, 并在返回值处定义了一个匿名函数作为参数。\n\n此时,add()函数就形成了一个闭包,它内部有一个变量x和一个引用了变量x的匿名函数。变量x对于这个匿名函数来说便属于外部变量。所以在add()的生命周期内,变量x会一直有效。\n\n于是我们先向add中传入10,在经过匿名函数的处理后,x的值已经变成了20。\n\n再看看主函数,我们将add()的返回值赋给了f然后打印输出。但需要注意的是,add()函数并没有在执行完第一条函数时就释放它的变量x。\n\nfmt.Printf(\"%v\\n\", f(10))\nfmt.Printf(\"%v\\n\", f(-9))\n还记得add()函数的返回值是什么类型吗?如果你去查看此时f的类型你就会发现它的返回值是func(int) int类型。相当于f也是一个函数,这相当于用f去调用add()里的匿名函数。\n\n这导致add()里的变量的生命周期和f的生命周期是一样的--一直到main函数结束。\n\nfmt.Printf(\"%T\\n\", f)\n \n//运行结果为\n//func(int) int\n但对于tmp()函数来说就不一样了,tmp调用add()中匿名函数的生命周期只到tmp函数本身结束。所以其结果与f无关。\n\n还是不理解?还是这段代码,但我们修改下tmp和f出现的位置。\n\npackage main\n \nimport \"fmt\"\n \nfunc add() func(int) int {\n\tx := 10\n\treturn func(y int) int {\n\t\tx += y\n\t\treturn x\n\t}\n}\nfunc tmp(num int) {\n\tx := add()(num)\n\tfmt.Printf(\"%v\\n\", x)\n}\nfunc main() {\n\tf := add()\n\tfmt.Printf(\"%v\\n\", f(10))\n\ttmp(10)\n\tfmt.Printf(\"%v\\n\", f(-9))\n \n}\n运行结果为\n\n20\n20\n11 \n\n 从运行结果我们可以看到tmp调用的add()中的变量x和f调用的add()中变量x无关。\n\n 那如果我们给tmp函数添加一个int类型的返回值呢?在main函数中将这个返回值赋给另一个值呢?add()中的变量x还会一直有效吗?\n\npackage main\n \nimport \"fmt\"\n \nfunc add() func(int) int {\n\tx := 10\n\treturn func(y int) int {\n\t\tx += y\n\t\treturn x\n\t}\n}\nfunc tmp(num int) int {\n\tx := add()(num)\n\treturn x\n}\nfunc main() {\n\tc := tmp(10)\n\tfmt.Printf(\"%v\\n\", c)\n\tc = tmp(9)\n\tfmt.Printf(\"%v\\n\", c)\n}\n运行结果为\n\n20\n19\n\n答案是不会,x的生命周期还是到tmp函数结束而结束。除非你把返回值改为函数类型的变量,让add()内部的匿名函数的生命周期随着main函数中的变量c,一直持续到main函数执行完而结束。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

送涂图

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值