在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是在支持头等函数(即函数为一等公民)的编程语言中实现词法绑定的一种技术。闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址)和一个关联的环境(相当于一个符号查找表)。环境里是若干对符号和值的对应关系,它既要包括约束变量(该函数内部绑定的符号),也要包括自由变量(在函数外部定义但在函数内被引用),有些函数也可能没有自由变量。闭包跟函数最大的不同在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即便脱离了捕捉时的上下文,它也能照常运行。捕捉时对于值的处理可以是值拷贝,也可以是名称引用,这通常由语言设计者决定,也可能由用户自行指定(如C++)。
闭包的概念出现于60年代,最早实现闭包的程序语言是Scheme。之后,闭包被广泛使用于函数式编程语言如ML语言和LISP。很多命令式程序语言也开始支持闭包。
在支持头等函数的语言中,如果函数f内定义了函数g,那么如果g存在自由变量,且这些自由变量没有在编译过程中被优化掉,那么将产生闭包。
闭包和匿名函数经常被用作同义词。但严格来说,匿名函数就是字面意义上没有被赋予名称的函数,而闭包则实际上是一个函数的实例,也就是说它是存在于内存里的某个结构体。如果从实现上来看的话,匿名函数如果没有捕捉自由变量,那么它其实可以被实现为一个函数指针,或者直接内联到调用点,如果它捕捉了自由变量那么它将是一个闭包;而闭包则意味着同时包括函数指针和环境两个关键元素。在编译优化当中,没有捕捉自由变量的闭包可以被优化成普通函数,这样就无需分配闭包结构体,这种编译技巧被称为函数跃升。
今天听郝林老师在《Go 语言核心 36 讲》中的解释,顿时清晰了。
闭包一般由高阶函数生成,并且大多数情况下会引用外部的自由变量,这个自由变量会在具体调用这个匿名函数时得以确定。
表面上,闭包只是延迟实现了部分程序功能或逻辑,但其真正的意义在于动态生成的那部分程序逻辑所带来的灵活性。
闭包之所以称为闭包,正是因为这个自由变量在调用时被确定了,原来的开放状态也就变成了闭合状态:
1、提高某个功能的灵活性,让使用方可以提供部分功能的实现。但这部分大小仍然由自身决定。
2、提供动态替换某个功能实现的可能性,这里的重点是动态。
3、使得代码动态替换的粒度降低到了函数级别。相比之下,模版类型的动态替换粒度是实例级别的。
写书,是作者在思考;读书,是作者牵引着读者一起思考。
透过事物或情绪的表象,去探寻本质,挺难。但通过别人的爱恨情仇,来反思自己的酸甜苦辣,却是一条捷径,我们为何不去做?
反思
想到昨天下午跟同事们说的一些话,有些后悔,我应该少说,甚至不说。
除非你在对方心中有影响力,否则没几个人真的愿意听你讲这讲那,大多数人在大部分情况下都会反感,甚至心怀不满。
也许对方表面上不说,但心里活动可能是:
你以为你是谁?有什么资格这么说我?我觉得你的建议也是垃圾…
人很多时候都是被情绪化左右的,喜欢听好听的,不喜欢啰里八嗦的建议。
为啥喜欢听好听的?因为“好听的”,就是自己内心真实的写照:心中早已有了答案,问你的建议,不过是想获得认同,难道还真听你的建议?
当然,人群中也许有 1% 的人真正愿意谦卑地听取他人的建议,我们称这种人具备成长性思维,他们归因于己,在因上努力,在果上随缘。
可是我能遇到多少这样的人呢?
所以,我告诉自己:
多读书,多思考,多写作。
工程级语言,内置一套完整的测试工具,确实香,还能看到测试覆盖率。
“在任何一段关系里,你最终获得的都是对自己更清晰的认识,获得的是自己的成长。每一段的关系都会带给你完全不同的人生体验,这种体验就是你人生的财富,而不是成本。”
池老团队和李一帆老师直播的干货,非常有启发,触发我们思考。
为什么思考这么重要?因为思考是不常见的。
观察一下朋友圈,你会发现大部分内容都是:状态和情绪。
我是谁,我在哪,我在干什么,哪里哪里打卡等等,这些都是状态。而我今天开心,难过,愤怒等等,都是情绪。
那问题又来了:为啥思考这么少?
反问自己:
一问就脸红,我好像很少与同道中人交流,与高人交流,也很少提出很好的问题。
要改变,要改变。
go 1.19 终于上新了...
➜ vifile >arch -arm64 brew upgrade go
==> Upgrading 1 outdated package:
go 1.18.5 -> 1.19
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/go-1.19.arm64_monterey.bottle.tar.gz
######################################################################## 100.0%
==> Upgrading go
1.18.5 -> 1.19
==> Pouring go-1.19.arm64_monterey.bottle.tar.gz
🍺 /opt/homebrew/Cellar/go/1.19: 12,426 files, 628.8MB
==> Running `brew cleanup go`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
Removing: /opt/homebrew/Cellar/go/1.18.5... (11,990 files, 596.2MB)
Removing: ~/Library/Caches/Homebrew/go--1.18.5.arm64_monterey.bottle.tar.gz... (168.2MB)
➜ vifile >
➜ vifile >go version
go version go1.19 darwin/arm64
➜ vifile >
我们时常听到“谁谁谁没有安全感”之类的话,那安全感是什么呢?
我理解有点像我身上的焦虑症,对某个方面不自信,隔三差五需要一些正向的反馈续命。
又有点像我们圈子里经常有人说的“35 岁职场危机”,当然其他职业也一样。这里的危机应该也算安全感缺失的一种:对未来的自己是否具有竞争力的那种不确定感。
还有一种可能,小时候某一方面的爱缺失了,比如《倚天屠龙记》里面的周芷若,张无忌等,所以他们可能一直都在找寻安全感。
“有的人的童年可以治愈一生,有的人一生都在治愈童年。”
前两天池老师在这篇文章《千万别借钱投资,更不要赌博》中提到一个技术大佬到处借钱投资,然后暴雷的事例。
这个技术大佬是“极客时间”的签约作者,他的课程有十几万人学习(我也买了),假设这门课卖 99 块,那么课程总收入会有千万,我猜测他能拿到百万级的收益。
我去网上搜索了一下,说暴雷的金额接近一个亿,这个数字可能不实,但估计也不低,准备卖房还债。一想到整个家庭从小资到贫农,一想到他的妻子,孩子,心里很后怕。
投资是否真的如此可怕?
行为金融学里有个概念叫做「短视损失厌恶(myopic loss aversion)」,是由著名学者理查德·赛勒(Richard Thaler)和施罗莫·贝纳茨(Shlomo Benartzi)提出的。
他们在 1995 年发布的论文里提到了这样一种有趣的现象,就是投资者对于自己的投资账户查看越频繁,通常回报就越低。
因为大多数人忍受不了短期价格波动的影响,总倾向于躲避暂时的浮亏,或者是赚一点钱就赶紧「落袋为安」,这样反反复复的操作不但让自己多交了好多手续费,还损失了更多长期收益。
如果现在把股市和房市对调,那么房地产估计也跟股市一样,波动大风险高。
A 公司的股票其实只值 1 块钱,大家蜂拥而至,它值 10 块;
B 公司的股票其实值 100 块,但大股波动,纷纷跳水,它变成了 20 块。
所以,最可怕的不是市场的波动,而是人心的变化。
囚徒困境:合作对大家都有好处,但背叛对背叛者有直接的好处。
读完万Sir的《博弈论究竟是什么》,瞬间明白了生活中很多现象背后的底层逻辑:
了解了博弈论,也让我多了一个视角去看待生活,只是以前的我从没思考过上面这些问题。
缺乏思考是非常可怕的,我们需要多问问自己:这是为什么?
Who am I ?
Where did I come from ?
Where do I go to find out ?