Giá trị zero cho sync.Mutex và sync.RWMutex` là hiệu quả. Do đó, con trỏ tới các mutex cơ bản là không cần thiết.

Không nên:

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

Được khuyến nghị:

var mu sync.Mutex
mu.Lock()

Nếu bạn sử dụng một con trỏ tới một cấu trúc, mutex nên là một trường không phải con trỏ của cấu trúc. Ngay cả khi cấu trúc không được xuất, đừng nhúng mutex trực tiếp vào cấu trúc.

Không nên:

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 {
  m.Lock()
  defer m.Unlock()

  return m.data[k]
}
// Trường Mutex, Lock, và Unlock và các phương thức là một phần của API có thể truy cập của SMap mà không cần khai báo rõ ràng.

Được khuyến nghị:

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]
}
// Mutex và các phương thức của nó là chi tiết triển khai của SMap và không được nhìn thấy bởi người gọi của nó.