syc.Mutexsync.RWMutex에 대한 제로 값은 효과적입니다. 따라서 뮤텍스에 대한 포인터는 기본적으로 불필요합니다.

권장되지 않음:

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

권장됨:

var mu sync.Mutex
mu.Lock()

만약 구조체에 대한 포인터를 사용한다면, 뮤텍스는 구조체의 비-포인터 필드여아 합니다. 구조체가 내보내지지 않았더라도 뮤텍스를 직접적으로 구조체에 포함시키지 마십시오.

권장되지 않음:

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]
}
// Mutex 필드, Lock 및 Unlock 메서드는 명시적으로 선언되지 않은 SMap의 내보낸 API의 일부입니다.

권장됨:

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]
}
// 뮤텍스와 해당 메서드들은 SMap의 구현 세부사항으로서 호출자에게는 보이지 않습니다.