Выбор ответа Senior sync и атомики обновлено

sync.Once и паника

Вопрос

Функция внутри once.Do(f) запаниковала. Что будет при следующем вызове once.Do(f)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: f не вызовется: Once считает её выполненной. Once отмечает выполнение даже при панике, поэтому повтора не будет, а ресурс так и останется неинициализированным.

Варианты ответа

  1. f вызовется повторно, ведь первый вызов не завершился
  2. f не вызовется: Once считает её выполненнойправильный ответ
  3. Do запаникует снова с той же ошибкой
  4. Do заблокируется навсегда на мьютексе

Разбор

Once отмечает выполнение даже при панике, поэтому повтора не будет, а ресурс так и останется неинициализированным. Если нужна повторная попытка или сохранение ошибки, используют sync.OnceValues (Go 1.21): он запоминает результат и ошибку, а при панике паникует тем же значением при каждом вызове. Блокировки навсегда не будет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.