Blog

用Once提供只初始化一次的值

Content #

我给你重点介绍一下很值得我们学习的 math/big/sqrt.go 中实现的一个数据结构,它通过 Once 封装了一个只初始化一次的值:

 // 值是3.0或者0.0的一个数据结构
 var threeOnce struct {
  sync.Once
  v *Float
}

  // 返回此数据结构的值,如果还没有初始化为3.0,则初始化
func three() *Float {
  threeOnce.Do(func() { // 使用Once初始化
    threeOnce.v = NewFloat(3.0)
  })
  return threeOnce.v
}

它将 sync.Once 和 *Float 封装成一个对象,提供了只初始化一次的值 v。 你看它的 three 方法的实现,虽然每次都调用 threeOnce.Do 方法,但是参数只会被调用一次。

当你使用 Once 的时候,你也可以尝试采用这种结构,将值和 Once 封装成一个新的数据结构,提供只初始化一次的值。

Viewpoints #

From #

08 | Once:一个简约而不简单的并发原语

用Once初始化Cache资源

Content #

比如标准库内部cache的实现上,就使用了 Once 初始化 Cache 资源,包括 defaultDir 值的获取:

func Default() *Cache { // 获取默认的Cache
  defaultOnce.Do(initDefaultCache) // 初始化cache
  return defaultCache
}

  // 定义一个全局的cache变量,使用Once初始化,所以也定义了一个Once变量
var (
  defaultOnce  sync.Once
  defaultCache *Cache
)

func initDefaultCache() { //初始化cache,也就是Once.Do使用的f函数
  ......
  defaultCache = c
}

  // 其它一些Once初始化的变量,比如defaultDir
  var (
  defaultDirOnce sync.Once
  defaultDir     string
  defaultDirErr  error
)

Viewpoints #

From #

08 | Once:一个简约而不简单的并发原语

一个优化Makefile的案例

Content #

我们可以编写如下所示的一段文本内容,并将它保存到项目根目录下名为 Makefile 的文件内。通过在该文件所在目录下直接执行 make 命令,项目得以被正确编译。

bin/main: src/main.c src/mod.c
  gcc src/main.c src/mod.c -I./include -lm -o bin/main

不使用make之前,每一次代码修改后,由于直接运行编译命令导致“全量编译”,进而带来的开发效率下降。

make 命令在每次实际进行编译前,都会首先追踪各个编译目标与其依赖项的版本信息(通常为“最后修改时间”)。而只有当相关依赖的内容在上一次编译后发生改变,或目标文件不存在时,才会再次编译该目标。通过这种方式,我们可以将大部分时间内的项目编译过程都集中在必要的几个源文件上,而不用“浪费”已编译好的其他中间目标文件。

接下来,我们尝试进一步优化 Makefile 中的配置项,来让最终的二进制编译目标与各个中间依赖项作进一步分离。并且,通过抽离编译命令中的可配置部分,我们也可以让整个编译脚本变得更具可读性与可用性。优化后的文件内容如下所示:

# 用于控制编译细节的自定义宏;
CC = gcc
CFLAGS = -I./include
LDFLAGS = -lm
TARGET_FILE = bin/main

# 描述各个目标的详细编译步骤;
$(TARGET_FILE): $(patsubst src/%.c,src/%.o,$(wildcard src/*.c))
  $(CC) $^ $(LDFLAGS) -o $@

src/%.o: src/%.c include/%.h
  $(CC) $< $(CFLAGS) -c -o $@ #do not link

Makefile 相关语法元素的含义在下面的表格中:

可以看到,通过以 “#” 开头的注释信息,我们将整个 Makefile 文件的内容划分成了两个部分。

第一部分包含用户可配置的一些宏常量,这些宏将在 make 运行时被替换到下面已经配置好的具体编译命令中。这样,用户可以通过修改这些量值来在一定范围内自定义期望使用的编译流程。

...

中心说服和外围说服

Content #

佩蒂和卡西奥波认为,人们被说服的方式基本上有两种——中心说服和外围说服。

说服的中心途径(the central route to persuasion)指的是对观点加以权衡,对相关的事实或数据加以考虑,在对问题进行系统思考的基础上作出决定。

相比之下,说服的外围路径(the peripheral route to persuasion)则没有经过多少深思熟虑;人们并非依据对观点说服力的权衡和思考过程,而是不做过多思考地依据那些简单的、往往不太相关的线索对观点做出正确与错误或者是否有吸引力的反应。

例如,如果你决定购买一台特定的笔记本电脑,因为你已经了解了它的用户友好性、处理速度、内存和数据存储,那么你就会被这些有力的证据所打动,这是中心路径。但如果你决定购买笔记本电脑,因为你最喜欢的艺人认可它,你会被与产品无关的问题所打动,这便是外围路径。有关说服力的诉求很少纯粹是中心或外围的,大多数都包含了这两种处理方式的要素。

From #

看法还是态度

Content #

说服一个人有多容易?答案在一定程度上取决于我们所要面对的是人们的看法还是态度。

看法指的是一个人认为是真的:我的看法是吃蔬菜对我有好处,系安全带可以减少交通事故,每天服用维生素很重要。这些看法主要是认知的;也就是说,它们发生在头脑中而不是情感深处。它们是短暂的;它们可以通过很好的证据来加以改变。因此,假如我收到一份对某项研究极好的综述,表明复合维生素补充剂充其量是无用的,至少不会导致对身体的伤害(就像实际情况一样),我很可能会改变对这个问题的看法。

但是假设一个人认为素食是不健康、不环保的,或者要求系安全带是对司机自由的非法侵害,或者维生素挽救了他朋友的生命。这些“看法”不再是纯粹的认知。几乎可以肯定的是,其中包含了强烈的情感,以及对主体好坏的评价。 包含情感和评价成分的观点被称为态度

与看法相比,态度是极难改变的——正如我们在讨论称为偏见的复杂态度时所看到的。当你阅读本章中关于影响策略的讨论时,你可能会记住看法和态度之间的区别。对某个人而言容易改变的看法,对另一个人则可能是根深蒂固的态度。

From #

多元化无知可能是影响课堂效果的一个重要障碍

Content #

对表达规范的顺从,可以使我们的社会互动趋于和缓。但是,我们利用他人来为自己定义情境,尤其是在涉及人们因恐惧而表达出强烈的情感,或者试图迎合人们对自己的期望时,便可能会出现问题。

人们通常认为公开表达某些情绪是不合时宜的,所以我们尽量表现出比实际情况更少的恐惧、担心、沮丧、焦虑或者性冲动。例如,从脱衣舞俱乐部顾客的脸上看,人们可能永远也不会猜测到他们的性冲动,甚至是性嗜好。同样,来自火星的著名访客也可能无法通过观察他们脸上的冷酷表情来感受到牙医候诊室中成年患者的焦虑。因此,通过观察他人的情绪表达来判断某种情况的严重性程度是具有误导性的,因为人们常常把真实的情感隐藏在“扑克脸”后面。

这会形成一种被社会心理学家称之为 多元化无知(pluralistic ignorance) 的现象,即由他人模棱两可的行为所导致错误规范的集体信仰。

大学课堂是看到多元化无知发挥作用的典型场所。假设你们的教授刚刚解释了某个非常复杂的概念。她对全班同学检查以确认是否每个人都能够理解。“有问题吗?还有谁不明白吗?”她问道。事实上,你是不明白这个概念的,你一定会期待得到进一步的解释。你漫不经心地四下扫了一眼,看看是否只有你一个人尚在困惑中,除了周围同学若无其事的表情,你什么也没有看到。他们的表现让你担心只有你自己是困惑的,这一点增加了你举手承认你不明白的风险。事实上,你的许多同学都有同样的感受,之所以他们做出那种表现,部分原因是看到了你的若无其事表现。

多元化无知可能是影响课堂效果的一个重要障碍,但它很容易被某种技巧所克服,这种技巧允许学生实时匿名回答某个潜在的令人尴尬的问题,比如“是否有人还没有搞清楚这个概念”。

From #

同呼吸、共命运

Content #

欧文·皮里亚文(Irving Piliavin)和他的同事后续的实验支持了我对野营地经历的推测。在他们的实验中,一名实验人员的帮手在纽约的一辆地铁车厢里蹒跚而行,当着其他几个人面倒在了地上。“受难者”躺在火车的地板上,盯着天花板。在不同情境下,这个场景重复了103次。最显著的结果是,在绝大部分时间里,人们自发地向受难者提供了帮助,特别是当受难者看起来明显生病时;在 95%以上的试验中,有人立即提供了帮助。即使受难者拿着一个酒瓶,浑身散发着酒臭味,他也在50%的试验中第一时间得到了帮助。与达利和拉塔纳实验中被试的行为不同,地铁列车上人们的帮助行为不受旁观者数量的影响。人们在拥挤的火车上(在那里可能有责任的扩散)和在几乎空着的火车上一样,经常会迅速地提供帮助。

尽管纽约地铁里的人们所处的环境与优胜美地国家公园的环境完全不同,但地铁和野营地有两个共同点:(1)人们乘坐的是同一节地铁车厢,由此而产生了共命运的感受;(2)他们与受难者处于面对面的情境之中,并且不可能迅速离开那里。

什么条件下会导致冷漠抑或利他主义更有可能发生呢?一定是在“同呼吸、共命运”的意识被清晰地激活、人们与受害者处于面对面的情境之时。当缺乏这类条件时,人们会快速地、经常是无意识地评估自己是否应该参与其中:情况的确很严重吗?是否需要我本人去干预?提供帮助对我而言是困难的,还是代价甚高的?我的帮助会让那些受害者受益吗?我能轻易地离开吗?你对这类情境的反应,将取决于你对上述问题的回答。

From #

旁观者效应与责任扩散

Content #

比博·拉塔纳和朱迪丝·罗丁(Judith Rodin)围绕着一位陷入困境的女性设计了一项实验。这位年轻女性要求120名男大学生填写一份问卷,然后她走了出去回到隔壁房间,说等学生们做完问卷就回来。几分钟后,她上演了一场意外。学生们(从隐藏的磁带录音中)听到了这位年轻女子爬上椅子的声音,接着是一声尖叫和一声撞击声,好像椅子倒塌了,她倒在了地板上。然后他们听到了她在呻吟和哭泣,她痛苦地喊道:“噢,我的上帝,我的脚,我……我不能移动它。噢……我的脚踝……我不能把这东西从我身上拿开。”喊叫声持续了大约一分钟,渐渐平息下来。

当然,这里的问题是,被试是否会去帮助这个女人。实验中最重要的变量,是这些年轻人是否单独呆在房间里。在那些单独呆在房间里的被试中,70%的人愿意向她提供帮助;而在那些与陌生人一起呆在房间里的被试中,只有20%的人愿意提供帮助。因此,仅仅因为其他旁观者在场便会抑制人们去采取行动。这种现象被称之为 旁观者效应(bystander effect) 。在随后的访谈中,那些与他人一起呆在房间里没有提供帮助的被试们谈到,他们推测事故可能并不严重。之所以作出这种判断,至少部分原因是同伴们没有采取行动。

除了从众之外,导致旁观者不去干预的另一个可能原因是 责任扩散(diffusion of responsibility) :即使人们认为事件的确是紧急事件,其他见证人在场也会分散每一个人的责任感。

为了验证这一想法,达利和拉塔纳设计了一个实验情境。在这个情境中,人们被安排在单独的房间里,但可以通过麦克风和耳机彼此交流。他们能够听到对方的声音,却看不见对方。研究人员随后播放了一段模仿癫痫发作声音的录音。在一种实验条件下,每个人都被引导相信他(她)是唯一偷听到癫痫发作的人;在其他实验条件下,每个人都被引导相信一个或多个人也听到了癫痫发作。那些认为自己是唯一倾听者的人比那些认为别人也在倾听的人更可能离开自己的房间,并试图去帮助他人。随着听者人数的增加,个人责任在听者中分散,提供援助的可能性随之降低。

From #

当一个陌生人陷入困境时,周围人不去干预的原因

Content #

珍诺维丝谋杀案引发了一系列研究,旨在探讨当一个陌生人陷入困境时,周围人不去干预的原因。

原因之一是文化规范。假如你在环球旅行时笔掉落在地、假装生病或假装失明,你更有可能得到拉美国家人民的帮助。这些国家的人们对和谐共处的重视程度更高,他们比美国人更愿意向他人提供帮助。在生活节奏较慢、对旁观者关注较少的地方,人们也更容易得到帮助。由罗伯特·莱文(Robert Levine)主持的一项研究发现,在像纽约这样拥挤的大都市,人们行色匆匆,面对着大量的干扰,获得帮助的可能性最低;人们首先要注意到你的痛苦,然后才能做出相应的反应。

人们不去干预的第二个原因是,即使确实注意到有人陷入困境,人们也可能无法对这种紧急情况进行准确的认定。约翰·达利、比博·拉塔纳(Bibb Latané)和他们的同事假设,如果许多人正在目睹受害者的痛苦,受害者便不太可能得到帮助。他们的不干预,是在其他人如何定义帮助或不帮助的合理性和适当性基础上形成的一种从众行为。那么,什么是思考或感受正在发生事情的适当方式?正如我们所看到的,其他人的所作所为往往是一个人最为清晰的引导。

From #

从众的两个主要原因

Content #

从众的主要原因有两个:

  1. 别人是有价值信息的来源基于丰富的信息:人们面对采取一致意见的多数人,会认为自己的观点因某种原因而出现了错误。
  2. 与别人相差太大令人感到不适;基于规范:人们会“随大流”,但内心相信他们最初的判断是正确的,以求被大多数人所接受或避免因意见不同而被他们所厌恶。

从众通过表达我们的相似性和思想上的亲近关系,来确保我们在某个群体中的地位。

在阿希实验以及其他一些直接进行判断的实验中,个体的行为在很大程度上似乎是为了避免产生被排斥的感觉。我们可以从这样一个事实推断出这一点:当允许人们不公开回答时,他们对直线匹配的问题都会给出诚实的意见。

同时,在许多情况下,我们顺从他人的行为是因为:随着物质现实变得越来越不确定,人们越来越依赖“社会现实”。也就是说,其他人的行为是了解正在发生事情的最佳指南。在这种情况下,一致性尤其有可能影响我们对现实的看法和感知,就像谢里夫实验中的学生和瑟伯在本章开头描述的场景一样:如果有人表现出某种行为,那一定是有道理的。

From #