互斥是否需要在Go中初始化?

时间:2017-08-17 20:10:49

标签: go locking mutex

我在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()
....

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

1 个答案:

答案 0 :(得分:9)

互斥锁不需要初始化。

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

看到这一点有效go:

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

  

由于new返回的内存归零,因此安排很有帮助   在设计数据结构时,每种类型的零值   无需进一步初始化即可使用。这意味着用户   数据结构可以创建一个新的和正确的工作。对于   例如,bytes.Buffer的文档声明“零   Buffer的值是一个可以使用的空缓冲区。“同样,   sync.Mutex没有显式构造函数或Init方法。   相反,sync.Mutex的零值被定义为未锁定   互斥。