В Go не нужен yargs или commander — пакет flag покрывает большинство CLI-задач. Разбираю механику флагов, почему они возвращают указатели, и паттерн обязательных аргументов.
select в Go ждёт сразу несколько каналов и выполняет тот case, который первым получил данные. Разбираю механику, паттерн таймаута через time.After и типичные ловушки при написании сканеров.
В Go нет встроенного assert — только t.Errorf. Зато есть паттерн table-driven tests, который делает тесты читаемыми и расширяемыми. Разбираю механику, соглашения и почему это лучше, чем тесты по одному.
Горутины похожи на Promise и async/await, но работают иначе — по-настоящему параллельно. Разбираю ключевые отличия, WaitGroup, типичную ловушку с захватом переменной цикла.
Канал — встроенный примитив Go для передачи данных между горутинами. Разбираю буферизованные и небуферизованные каналы, worker pool и главное правило: кто пишет — тот и закрывает.
Go отказался от исключений в пользу ошибок-значений. Разбираю дизайнерское решение, механику wrapping и типичные ловушки, на которые попадают разработчики из JS/TS.
context.Context — стандартный способ ограничить время выполнения и отменить сетевые вызовы в Go. Разбираю WithTimeout, WithCancel, defer cancel() и типичные ошибки при работе с контекстом.
В Go несколько горутин могут читать и писать одни данные одновременно. Разбираю sync.Mutex, sync.RWMutex, sync.Once, детектор гонок и почему defer mu.Unlock() критичен.
В Go нет явного implements — тип реализует интерфейс автоматически, если у него есть нужные методы. Разбираю как работает утиная типизация, pointer receiver vs value receiver, и почему маленькие интерфейсы — это идиоматичный Go.