初始化RWMutex在golang崩溃?

初始化RWMutex在golang崩溃?,go,Go,以下代码因以下错误而崩溃,原因是 package main import ( "sync" ) var foo *sync.RWMutex func main() { foo.Lock() } 产出: panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0

以下代码因以下错误而崩溃,原因是

package main

import (
    "sync"

)

var foo *sync.RWMutex

func main() {
    foo.Lock()
}
产出:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x8125c]

goroutine 1 [running]:
sync.(*RWMutex).Lock(0x0, 0x104000f0)
    /usr/local/go/src/sync/rwmutex.go:86 +0x1c
main.main()
    /tmp/sandbox093456788/main.go:11 +0x20

Program exited.
当您使用以下行之一时,不会发生这种情况

var foo = new(sync.RWMutex)
var foo sync.RWMutex

用于foo变量的初始化。

互斥锁通常设计为在不进行任何初始化的情况下工作。也就是说,使用它们只需要一个零值互斥。要修复程序,请将
foo
声明为值。不是指向互斥对象的指针:

var foo sync.RWMutex

func main() {
    foo.Lock()
}
foo
声明为指针时:

var foo *sync.RWMutex
foo
是一个零值指针(指向键入
sync.RWMutex
),即它不指向有效的互斥值
foo
nil
。这就是调用方法时出现nil指针异常的原因

但是,请注意,要在goroutine/函数之间共享互斥,必须在初始化它们之后(如上所述)将它们作为指针传递,否则它们将不会被共享

从文档中:

首次使用后不得复制RWMutex


Docs:

ok,因此由于访问RWMutex结构的结构成员w,会发生死机。为此,必须取消引用指向此结构的指针(为零)。奇怪的默认设置是Go,为什么不使用new()操作符初始化,它也会返回一个指针呢?因为
new
完全初始化一个类型,然后返回一个指向它的指针
var
无需初始化,只需创建一个设置为该类型零值的类型。将原始代码更改为
var foo=new(sync.RWMutex)
也可以修复此错误,因为
foo
是指向完全初始化互斥的指针。欢迎使用StackOverflow,我建议您查看Go tour