Можно ли передавать примитивы синхронизации в качестве параметра функции

«Можно ли передавать примитивы синхронизации в качестве параметра функции» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, примитивы синхронизации (например, sync.Mutex, sync.WaitGroup, sync.Once) можно передавать в функции как параметры. Однако важно передавать их по указателю (*sync.Mutex), иначе будет копироваться значение, что приведет к неожиданному поведению, так как копия не синхронизируется с оригиналом.

Пример:

func lockAndUnlock(m *sync.Mutex) {
    m.Lock()
    defer m.Unlock()
    // работа с защищенными данными
}

func main() {
    var m sync.Mutex
    lockAndUnlock(&m) // передача по указателю
}