sync.Mutex
and 和.RWMutex的零值是有效的,
你几乎不需要一个指向mutex的指针。
坏的编程方式:
mu := new(sync.Mutex)
mu.Lock()
好的编程方式:
var mu sync.Mutex
mu.Lock()
如果使用结构体指针,mutex可以非指针形式作为结构体的组成字段。
对于一个非导出的结构体(首字母小写)类型或者是要实现Mutex接口的类型,可以自动嵌入mutex.
type smap struct {
sync.Mutex // 仅仅用于非导出类型
data map[string]string
}
func newSMap() *smap {
return &smap{
data: make(map[string]string),
}
}
func (m *smap) Get(k string) string {
// Mutex直接嵌入到了结构体中,且可以为非指针的形式
m.Lock()
defer m.Unlock()
return m.data[k]
}
而对于导出的结构体(首字母大写),mutex 必须声明为一个私有字段。即必须使用私有锁。
type SMap struct { //导出类型
mu sync.Mutex //私有字段
data map[string]string
}
func NewSMap() *SMap {
return &SMap{
data: make(map[string]string),
}
}
func (m *SMap) Get(k string) string {
m.mu.Lock() //必须显示指定私有锁
defer m.mu.Unlock()
return m.data[k]
}