مقادیر صفر برای sync.Mutex
و sync.RWMutex
موثر هستند. بنابراین، اشارهگرها به قفلها (mutex) در واقع غیرضروری هستند.
توصیه نمیشود:
mu := new(sync.Mutex)
mu.Lock()
توصیه میشود:
var mu sync.Mutex
mu.Lock()
اگر از یک اشارهگر به یک ساختار استفاده میکنید، mutex باید یک فیلد غیر اشارهگر از ساختار باشد. حتی اگر ساختار صادر نشده باشد، مستقیماً mutex را به ساختار جانمایی (Embed) نکنید.
توصیه نمیشود:
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 بدون اعلان صریح است.
توصیه میشود:
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 و متدهای آن جزئیات پیادهسازی SMap هستند و برای فراخوانندگان آن قابل مشاهده نیستند.