Go 中互斥体需要初始化吗?

Do Mutexes need initialization in Go?

我正在用 Go 编写一些线程安全的东西。我尝试使用互斥锁。

我找到的示例 here,似乎使用了没有任何初始化的互斥量:

...
// essential part of the referred page
// (it is not my code, I know the pointer is unneeded here,
// it is the code of the referred site in the link - @peterh)

var mutex = &sync.Mutex{}
var readOps uint64 = 0
var writeOps uint64 = 0

for r := 0; r < 100; r++ {
    go func() {
        total := 0
        for {
            key := rand.Intn(5)
            mutex.Lock()
....

我有点惊讶。是真的吗,他们不需要任何初始化?

互斥不需要初始化。

也可以是 var mutex sync.Mutex,不需要指针,int 值也一样,不需要将它们设置为 0,因此您找到的示例可以改进。在所有这些情况下,零值都可以。

看到这段有效的go:

https://golang.org/doc/effective_go.html#data

Since the memory returned by new is zeroed, it's helpful to arrange when designing your data structures that the zero value of each type can be used without further initialization. This means a user of the data structure can create one with new and get right to work. For example, the documentation for bytes.Buffer states that "the zero value for Buffer is an empty buffer ready to use." Similarly, sync.Mutex does not have an explicit constructor or Init method. Instead, the zero value for a sync.Mutex is defined to be an unlocked mutex.