Ответ
Да, примитивы синхронизации (например, 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) // передача по указателю
}