知识卡片

返回值陷阱

普通读书笔记卡 · 1476.a

内容

defer 在 return 赋值后、函数真正返回前执行,因此可以修改命名返回值。这个能力适合统一收尾,也容易制造隐式控制流;清晰性比技巧更重要。

参考来源

- 位置:《Go语言底层原理剖析》第10章《defer延迟调用》10.3节《defer返回值陷阱》 - 结论依据:原文明确"return其实并不是一个原子操作,其包含了下面几步:将返回值保存在栈上→执行defer函数→函数返回",并用两个例子(defer 修改具名返回值 g 与不修改)对比证明 defer 在返回值写入栈之后、函数真正返回之前执行,因此可以推出"defer 能修改具名返回值、return 不是原子操作"的结论。 - 原始内容:但是,上面两种代码的输出结果推测出的结论是截然相反的……原因在于return其实并不是一个原子操作,其包含了下面几步:将返回值保存在栈上→执行defer函数→函数返回。所以第1个例子中的函数f可以翻译为如下伪代码,最终返回值r为100。第2个例子中的函数f可以翻译为如下伪代码,最终返回值r为200。