mutex.Lock 并推迟 mutex.Unock 订单

mutex.Lock and defered mutex.Unock order

在golang中,sync.MutexLock和Unlock是usaul操作,但是Lock和defer Unlock的正确顺序是什么?

mu.Lock()
defer mu.Unlock()

defer mu.Unlock()
mu.Lock()

哪个最好?

没关系

无论哪种方式,defer 都会导致 mu.Unlock() 在当前作用域退出时执行(例如 returns 的函数)。

第一种方法更可取,因为它具有更自然的顺序(锁定,然后解锁)以提高人类可读性。

我认为第一个变体更自然且更易于阅读。您可能会看到获取锁并在准备释放的同一代码段中看到:

mu.Lock()
defer mu.Unlock()

无论如何,延迟的函数调用将在稍后执行 - 在函数退出时执行。

推迟

A defer statement defers the execution of a function until the surrounding function returns.

The deferred call's arguments are evaluated immediately, but the function call is not executed until the surrounding function returns.

你的两个变体是相同的,因为 deferred 函数放在哪里并不重要,它将在周围的函数 returns.

之后执行

注意 如果你有多个 deferred 函数,它将根据 defer 声明的顺序以相反的顺序执行。