Как отмечается в комментариях - вам нужно защитить доступ к данным, а не функциональный доступ.
Самый простой способ добиться этого - создать тип структуры с блокировкой - и прикрепить критическое функциональное обновление в качестве метода, например
type MyData struct {
l sync.Mutex
// add any other task related attributes here too
}
// makeUpdate *MUST* use a pointer to our struct (i.e. 'm *MyData')
// as Mutex logic breaks if copied (so no 'm MyData')
func (m *MyData) makeUpdate(id int) {
m.l.Lock()
defer m.l.Unlock()
fmt.Printf("better makeUpdate(%d)\n", id)
// do critical stuff here
// don't dilly-dally - lock is still being used - so return quickly
}
Попробуйте это на игровой площадке .