【发布时间】:2018-08-07 08:35:56
【问题描述】:
我正在检查一些现有的代码,并看到这重复了几次
defer mtx.Unlock()
mtx.Lock()
这在我看来是错误的,我更喜欢在执行Lock 之后推迟Unlock 的惯用方式,但Mutex.Lock 的文档没有指定Lock 将失败的情况。因此早期defer 模式的行为应该与惯用方式相同。
我的问题是:是否有令人信服的理由说这种模式是劣等的? (例如Lock 可能会失败,然后延迟的Unlock 将panic)因此代码应该更改还是应该保持原样?
【问题讨论】:
-
它看起来很奇怪,但它是好的。很久以前有人声称你先推迟更快(不确定是否仍然 - 或根本 - 真的)。我认为它是劣等的,因为它违反了代码的常见线性阅读。 Lock tan defer 是“让我们拿到锁,我们有锁:不要忘记解锁它”。倒过来的版本是“别忘了解锁我接下来要锁的锁”。
-
感谢@Volker,请考虑将其添加为答案。
-
虽然@Volker 是正确的,但我认为这是一种反模式。原因很简单:您通常使用
defer来撤消已经完成的操作。 毕竟,这是非常简单的逻辑。因此,虽然延迟解锁尚未锁定的内容在技术上很好,但在逻辑上却不是很好,这里我们得出了这样一个原则:“必须编写程序供人们阅读,并且只是偶然地供机器执行。”