if, for, switch

Тема дорожной карты · Golang

Управление потоком выполнения в Go выражается через операторы if, for и switch — намеренно минимальный набор, охватывающий все паттерны ветвления и циклов без синтаксических излишеств многих других языков. Оператор if в Go может включать инициализирующее выражение (if err := doSomething(); err != nil { ... }) — паттерн настолько идиоматичный, что он встречается во всей стандартной библиотеке и в фреймворках Gin и Echo. В Go только одна конструкция цикла — for, — покрывающая трёхчастные C-стиль циклы, while-стиль циклы (for condition { ... }), бесконечные циклы (for { ... }) и итерацию по слайсам, словарям, строкам и каналам через for k, v := range collection. Оператор switch в Go по умолчанию не проваливается (в отличие от C), поддерживает выражения или переключение по типу (switch v := i.(type) { case int: ... }) и может использоваться без условия как чистая альтернатива длинным цепочкам if-else. Оператор defer, откладывающий вызов функции до возврата из текущей функции, завершает набор инструментов управления потоком Go и широко используется для освобождения ресурсов, снятия блокировок мьютексов и восстановления после паник в продакшен Golang-сервисах.

Как это работает

if, for, switch намеренно мал: ключевые слова (var, const, if, for, switch, defer, go, select, return, type, func, package, import), нет классов (struct + методы + интерфейсы), нет исключений (multi-return + error-значения), нет наследования (композиция через embedding). Видимость по регистру: с заглавной — экспорт, со строчной — package-private. := объявляет + присваивает; = — присваивает. defer выполняется при возврате функции — идеально для cleanup. Компилятор не пропустит неиспользуемые импорты + переменные.

Когда применять

Примите минимализм — Go дерётся с попытками умничать. gofmt (без флагов, канонический стиль); коммитьте только отформатированный код. defer — для cleanup в паре с захватом (defer f.Close() сразу после f, err := os.Open(...)). Короткое объявление (:=) внутри функций; var — для zero-valued объявлений или когда нужен конкретный тип.

Типичные ошибки

Ловушки if, for, switch: for i := range slice и получение и индекса и копии, когда хотели оба (for i, v := range slice); shadow внешних переменных через := ("почему внешняя переменная не изменилась?"); не обрабатывают ошибку немедленно (_, _ = ... игнорирует); глобальное состояние — Go-программы становятся сложными для понимания при shared mutable state.

Связанные понятия

Полезные ресурсы