Управление потоком
Управляющие конструкции Go — if/else с init-выражением, единственный цикл for во всех формах, switch без проваливания, range и panic/recover.
6 вопросов
JuniorТеорияОчень частоКакие формы цикла даёт единственное ключевое слово for в Go?
Какие формы цикла даёт единственное ключевое слово for в Go?
В Go одно ключевое слово цикла, for, в трёх обликах: C-стиль for init; cond; post {} со всеми тремя частями, while-стиль for cond {} лишь с условием и бесконечный for {}. break выходит, а continue переходит к следующей итерации.
Типичные ошибки
- ✗Искать в Go отдельное ключевое слово
whileилиdo-while - ✗Писать
for true {}вместо голого бесконечногоfor {} - ✗Думать, что
break/continueне нацелить на внешний цикл меткой
Уточняющие вопросы
- →Чем метковый
breakотличается от метковогоcontinue? - →Какую область имеет переменная, объявленная в init-части
for?
JuniorТеорияЧастоКак работают if/else в Go, включая init-выражение?
Как работают if/else в Go, включая init-выражение?
if в Go берёт голое булево условие: без скобок, но фигурные скобки обязательны. Init-выражение вроде if x := f(); cond {} выполняется первым, и его имя видно лишь в if/else. else стоит на строке закрывающей скобки.
Типичные ошибки
- ✗Оборачивать условие в скобки или опускать фигурные скобки, как в C
- ✗Читать переменную из init-выражения после конца блока
if/else - ✗Ставить
elseна отдельной строке под закрывающей скобкой
Уточняющие вопросы
- →Почему Go отвергает
elseна новой строке — какое правило виновато? - →Как область init в
ifвзаимодействует с затенением внешнего имени?
JuniorТеорияЧастоПо чему итерирует for range и что он выдаёт?
По чему итерирует for range и что он выдаёт?
for range обходит встроенные коллекции: по срезу или массиву даёт (индекс, значение), по map — (ключ, значение) случайно, по строке — байтовый индекс плюс руну, по каналу — каждое значение, пока он не закроется. _ отбрасывает значение.
Типичные ошибки
- ✗Ожидать
(значение, индекс)вместо порядка Go(индекс, значение) - ✗Думать, что range по map обходит ключи в стабильном порядке
- ✗Считать, что range по строке выдаёт байты, а не руны-кодовые точки
Уточняющие вопросы
- →Почему range по строке шагает по байтовому индексу, но выдаёт руны?
- →Когда range по каналу останавливается и что завершает этот цикл?
JuniorТеорияЧастоЧем switch в Go отличается от C в части проваливания?
Чем switch в Go отличается от C в части проваливания?
В Go case НЕ проваливается: управление покидает switch после совпавшего case, поэтому завершающий break не нужен. Поведение C включают явным fallthrough, а switch {} без выражения из булевых case заменяет цепочку if-else.
Типичные ошибки
- ✗Добавлять завершающий
breakк каждому case, как сделали бы в C - ✗Ожидать проваливания case, пока не написан
fallthrough - ✗Не знать, что
switch {}без выражения заменяет цепочку if-else
Уточняющие вопросы
- →Что
fallthroughделает с проверкой условия следующего case? - →Чем switch по типу отличается от этого switch по значению?
JuniorТеорияИногдаЧто делают panic и recover и где работает recover?
Что делают panic и recover и где работает recover?
panic останавливает поток и разматывает стек, выполняя отложенные вызовы вверх; без обработки валит программу. recover работает лишь в отложенной функции: отдаёт значение паники и прекращает разматывание. Применяйте оба только в исключительных случаях.
Типичные ошибки
- ✗Вызывать
recoverвне отложенной функции, где он возвращает nil - ✗Применять
panic/recoverк обычным ошибкам вместо возвратаerror - ✗Думать, что отложенные вызовы пропускаются при разматывании паники
Уточняющие вопросы
- →Что возвращает
recover, когда никакой паники сейчас нет? - →Как паника в одной горутине влияет на остальные в программе?
MiddleТеорияИногдаКогда switch без выражения заменяет цепочку if-else?
Когда switch без выражения заменяет цепочку if-else?
switch {} без выражения не несёт значения, поэтому каждый case — своя булева проверка. Go выполняет первый истинный case сверху вниз и выходит — опрятнее длинной цепочки if/else if. Явный fallthrough выполняет следующий case безусловно.
Типичные ошибки
- ✗Думать, что выполняется каждый истинный case, а не только первый совпавший
- ✗Считать, что
fallthroughперепроверяет условие следующего case перед запуском - ✗Добавлять значение после
switch, когда нужна форма без выражения
Уточняющие вопросы
- →Как ведёт себя
fallthroughв самом последнем case у switch? - →Когда длинная цепочка
if/else ifвсё же яснее такого switch?