Управление потоком
Управляющие конструкции Go — if/else с init-выражением, единственный цикл for во всех формах, switch без проваливания, range и panic/recover.
10 вопросов
JuniorТеорияОчень частоЧто выведет программа?
Что выведет программа?
012
Открыть задачу →Типичные ошибки
- ✗Ждать
123:range 3считает с нуля, поэтомуiпринимает значения 0, 1 и 2. - ✗Ждать
0123или ошибку компиляции:for i := range n— допустимая формаforс Go 1.22, и она выполняется ровноnраз.
Уточняющие вопросы
- →Чем метковый
breakотличается от метковогоcontinue? - →Какую область имеет переменная, объявленная в init-части
for?
JuniorТеорияЧастоЧто выведет программа?
Что выведет программа?
12457
Открыть задачу →Типичные ошибки
- ✗Ждать
12:continueне выходит из цикла, какbreak, а пропускает остаток текущего прохода, поэтому выпадают только 3 и 6. - ✗Ждать
1245: условиеi <= 7для 7 ещё истинно, поэтому последний проход выполняется и печатает 7.
Уточняющие вопросы
- →Что напечатает программа, если заменить
continueнаbreak? - →Как остановить цикл после первого числа больше 4?
JuniorТеорияЧастоЧто выведет программа?
Что выведет программа?
10
Открыть задачу →Типичные ошибки
- ✗Ждать
15: условиеi < 5становится ложным, когдаiдоходит до 5, поэтому тело выполняется только для 1, 2, 3 и 4. - ✗Ждать промежуточные суммы
1 3 6 10:fmt.Printlnстоит после закрывающей скобки цикла и выполняется один раз, когда цикл закончен.
Уточняющие вопросы
- →Как изменить цикл, чтобы он сложил числа от 1 до 5?
- →Как записать этот же цикл только с условием после
for?
JuniorТеорияЧастоЧто произойдёт при сборке и запуске программы?
Что произойдёт при сборке и запуске программы?
Не скомпилируется
Открыть задачу →Типичные ошибки
- ✗Ждать
11: переменная из инициализацииifживёт только внутриifи егоelse; после закрывающей скобкиvне определена. - ✗Ждать после
ifпеременнуюvс нулевым значением: внешнейvнет вовсе, поэтому компилятор останавливается с ошибкойundefined: v.
Уточняющие вопросы
- →Как изменить программу, чтобы она напечатала
11? - →В каких ещё конструкциях Go можно объявить переменную только для этой конструкции?
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ТеорияЧастоЧто выведет программа?
Что выведет программа?
a
Открыть задачу →Типичные ошибки
- ✗Ждать
ab: Go выполняет только первый case с истинным условием и выходит изswitch; сам по себе в следующий case он не проваливается. - ✗Ждать ошибку компиляции из-за отсутствия
break: в Gobreakв конце case не нужен, потому что выход изswitchпроисходит сам.
Уточняющие вопросы
- →Что напечатает программа, если добавить
fallthroughпослеfmt.Print("a")? - →Как перечислить несколько значений в одном
caseуswitchс выражением?
JuniorТеорияЧастоЧто выведет программа?
Что выведет программа?
2
Открыть задачу →Типичные ошибки
- ✗Ждать пустой вывод:
fallthroughпереходит в следующий case, не проверяя его значение, поэтомуcase 3выполняется, хотяxравно 2. - ✗Ждать
3или ошибку компиляции:fallthroughлишь переходит в следующий case и не меняетx, а case может состоять из одногоfallthrough.
Уточняющие вопросы
- →Что
fallthroughделает с проверкой условия следующего case? - →Чем switch по типу отличается от этого switch по значению?
JuniorТеорияИногдаЧто делают panic и recover и где работает recover?
Что делают panic и recover и где работает recover?
panic прерывает обычное выполнение и разматывает стек, выполняя отложенные вызовы вверх; без обработки завершает программу. recover работает лишь в отложенной функции: отдаёт значение паники и прекращает разматывание. Применяйте оба только в исключительных случаях.
Типичные ошибки
- ✗Ждать, что
recoverлишь скрывает сообщение о падении: в отложенной функции он прекращает разматывание, и функция обычным образом возвращается к вызвавшему коду. - ✗Ждать, что
recoverработает где угодно в теле: вне отложенной функции он возвращаетnil, и паника продолжается.
Уточняющие вопросы
- →Что возвращает
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?