syc.Mutex
및 sync.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의 구현 세부사항으로서 호출자에게는 보이지 않습니다.