defer в Go: порядок выполнения, ловушки и когда defer не срабатывает
Как работает defer в Go: порядок LIFO, момент вычисления аргументов, defer в цикле, именованный возврат и случаи, когда отложенный вызов не сработает.
Go — это язык программирования с открытым исходным кодом для создания простого, производительного и отказоустойчивого программного обеспечения на масштабных проектах.
Язык идеально подходит для создания облачных сервисов благодаря:
Используя Go создают мощные CLI-приложения с:
Преимущества Go для веба:
Go особенно популярен в DevOps благодаря:
Официальное название языка — Go. Имя “Golang” появилось потому, что изначально запущенный в 2009-ом году сайт проекта располагался по адресу golang.org. Название домена и дало начало общепринятому, но неофициальному названию. Сейчас golang используется в основном на интернет ресурсах для тегов материалов, связанных с языком разработки Go. Действующий домен go.dev появился только в 2019 году.
Архивную версию оригинального сайта можно посмотреть через Wayback Machine.
Дополнительные материалы:
Как работает defer в Go: порядок LIFO, момент вычисления аргументов, defer в цикле, именованный возврат и случаи, когда отложенный вызов не сработает.
Горутины и каналы в Go для начинающих: как запустить горутину через go, дождаться её завершения, обмениваться данными через каналы, select и типичные ошибки.
Три рабочих паттерна конкурентности в Go на примерах: pipeline (конвейер), fan-out/fan-in и worker pool. Когда какой выбрать, как ограничить параллелизм, отменять и обрабатывать ошибки.
Удаление элемента из слайса в Go: append с сохранением порядка, slices.Delete из стандартной библиотеки и быстрый способ за O(1) без сохранения порядка.
Шпаргалка по ошибкам в Go на одной странице: готовые сниппеты, таблица «ситуация → инструмент», errors.Is vs errors.As и антипаттерны, которые стоит ловить на ревью.
Разбор context.Context в Go с примерами: отмена горутин через WithCancel, таймауты WithTimeout, передача значений WithValue, правила и типичные ошибки.
Как устроены строки в Go: чем rune отличается от byte, почему len считает байты, как эффективно собирать строки через strings.Builder и конвертировать int↔string.
Дорожная карта изучения Go с нуля: установка, синтаксис, типы, интерфейсы, ошибки, горутины, тестирование и инструменты. С чего начать и в каком порядке.
Как собеседовать Senior Go-разработчика: технический этап по Go и отдельный архитектурный этап. Темы, вопросы, критерии оценки, на что обращать внимание.
Туториал по фаззингу в Go: как устроены fuzz-функции, корпус, минимизация. Разбираем реальный кейс бага в sonic, найденный через фаззинг.
Почему map с составным ключом-структурой быстрее вложенных map в Go: бенчмарки, внутреннее устройство map в runtime и практические рекомендации
Сравнение VALUES и UNNEST для массовой вставки в PostgreSQL из Go. Бенчмарки с testcontainers, примеры кода, рекомендации.
Подробный разбор пакета errgroup в Go: API, контекст с отменой, ограничение параллелизма, TryGo, сравнение с WaitGroup и каналами, типичные ошибки и реальные сценарии.
Идиоматичная обработка ошибок в Go: интерфейс error, оборачивание через fmt.Errorf и %w, sentinel-ошибки, errors.Is и errors.As, errors.Join и практические паттерны.
Практическое руководство по тестированию в Go: табличные тесты, моки через интерфейсы, testify, httptest, покрытие кода и интеграционные тесты.
Что изменилось в sync.WaitGroup в Go 1.25: новый метод wg.Go(), проверка go vet для Add внутри горутины и как избежать гонки при ожидании горутин.
Как реализовать graceful shutdown в Go: корректная остановка HTTP-сервера, завершение текущих запросов, консистентность данных в БД и принципы 12-factor app.
Как http.Client в Go переиспользует TCP-соединения, зачем полностью читать resp.Body и что происходит при частичном чтении. Бенчмарки.
Сравнение трёх способов работы с PostgreSQL из Go: lib/pq + database/sql, sqlx и pgx. Бенчмарки, примеры кода, рекомендации.
Пять правил программирования Роба Пайка: почему не стоит оптимизировать без измерений, зачем выбирать простые алгоритмы и почему данные важнее кода
Глубокий разбор собеседования Middle Go-разработчика: конкурентность, архитектура, базы данных, производительность, бизнес-ориентация и взаимодействие с заказчиком. Критерии оценки и практические примеры вопросов.
Как измерять и оптимизировать производительность Go-кода: базовые бенчмарки, статистический анализ с benchstat, типичные ошибки. Примеры с реальными цифрами.
Почему в Go дата форматируется через 2006-01-02 15:04:05, а не через %Y-%m-%d. Разбираем логику reference time, все компоненты формата и типичные ошибки.
Как и почему я написал программу на Go, которая каждую неделю покупает паи фонда TMOS для моих детей через API Т-Банка. Стратегия DCA, systemd-таймер и 5 месяцев без единого пропуска.
Обзор онлайн-инструментов для Go: официальный playground и Compiler Explorer. Тестируйте код, смотрите ассемблер и делитесь примерами без установки компилятора.
История появления Go: от кризиса сборок в Google до философии простоты и роли языка в Cloud Native
Погружение в указатели в Go: как они работают, влияют на аллокацию памяти и взаимодействуют с garbage collector. Запись выступления с митапа по Golang.
Как добавить поддержку XDG Base Directory в Terraform без нарушения обратной совместимости — опыт open-source контрибуции.
Видео о том ускорить сборку Docker образов для Go приложений
Задача на проверку знаний нюансов работы со слайсами
Задача для собеседования на Go про проход по ключам map
Вопрос для Golang собеседования про DNS.
Golang: преобразование чисел в строки. Примеры с strconv.Itoa, fmt.Sprintf, strconv.FormatInt для новичков и профи.
В чём разница межу пустым nil и пустым не-nil слайсом?
Разберитесь с особенностями работы горутин и планировщика на примере реальной задачи с собесеований.
Разберитесь с работой срезов в Go на примере трёх слайсов — ключ к пониманию их поведения в памяти и успеху на собеседовании!
Как во время компиляции проверить соответсвие интерфейсу в Go
Про Go 1.24
Нюансы SSL и Docker образов
Оптимизируйте сборку Go-приложения в Docker, ускорьте процесс разработки, избежав повторных загрузок пакетов и используя переиспользование build кэша.
Основные темы для собеседования Junior Golang-разработчиков: ключевые особенности языка, типы данных, конкурентность, интерфейсы, тестирование, проекты и работа с библиотеками.