• 零值Mutexes是有效的

    零值Mutexes是有效的

    零值的 sync.Mutexsync.RWMutex 是有效的,所以基本是不需要一个指向 Mutex 的指针的。

    BadGood
    1. mu := new(sync.Mutex)
    2. mu.Lock()
    1. var mu sync.Mutex
    2. mu.Lock()

    如果你希望通过指针操作结构体,mutex 可以作为其非指针结构体字段,或者最好直接嵌入结构体中。

    1. type smap struct {
    2. sync.Mutex
    3. data map[string]string
    4. }
    5. func newSMap() smap {
    6. return &smap{
    7. data: make(map[string]string),
    8. }
    9. }
    10. func (m smap) Get(k string) string {
    11. m.Lock()
    12. defer m.Unlock()
    13. return m.data[k]
    14. }
    1. type SMap struct {
    2. mu sync.Mutex
    3. data map[string]string
    4. }
    5. func NewSMap() SMap {
    6. return &SMap{
    7. data: make(map[string]string),
    8. }
    9. }
    10. func (m SMap) Get(k string) string {
    11. m.mu.Lock()
    12. defer m.mu.Unlock()
    13. return m.data[k]
    14. }
    嵌入到非导出类型或者需要实现 Mutex 接口的类型。对于导出类型,将 mutex 作为私有成员变量。