零值 Mutex 是有效的
发布者:admin 发表于:444天前 阅读数:644 评论:0

零值 sync.Mutexsync.RWMutex 是有效的。所以指向 mutex 的指针基本是不必要的。

Bad Good

mu := new(sync.Mutex) mu.Lock() |

var mu sync.Mutex mu.Lock() |

如果你使用结构体指针,mutex 可以非指针形式作为结构体的组成字段,或者更好的方式是直接嵌入到结构体中。

如果是私有结构体类型或是要实现 Mutex 接口的类型,我们可以使用嵌入 mutex 的方法:

type smap struct { sync.Mutex // only for unexported types(仅适用于非导出类型)

data map[string]string }

func newSMap() *smap { return &smap{ data: make(map[string]string), } }

func (m *smap) Get(k string) string { m.Lock() defer m.Unlock()

return m.data[k] } |

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] } | | 为私有类型或需要实现互斥接口的类型嵌入。 | 对于导出的类型,请使用专用字段。 |