Тема: go
-
Go или Rust для нового сервиса: процедура выбора без бенчмарков
Выбирайте Go или Rust для сервиса по документированным свойствам языков и ограничениям команды, а не по мифам о бенчмарках: модель управления памятью, стиль обработки ошибок и конкурентности, характер нагрузки, необходимые библиотеки для взаимодействия и люди, которые будут сопровождать сервис через два года.
-
Cancellation and deadlines in Go with context.Context
Thread a context.Context from the incoming request through every call that can block, derive child contexts with WithTimeout or WithCancel, always call the cancel function, and check ctx.Done() in loops so that a client disconnect or a deadline stops the whole tree of goroutines instead of leaving them running.
-
Измерение прошедшего времени в Go: сериализация теряет компонент монотонных часов
Отделяйте локальное измерение длительности от сохранённых временных меток и правил работы с межпроцессными сроками.
-
Интерфейсы Go: неявная реализация и nil, который не равен nil
Тип Go реализует интерфейс, если у него есть нужные методы; объявлять это не требуется. Поэтому небольшие интерфейсы легко определять в месте использования. Но значение интерфейса — пара из типа и значения, и nil-указатель, помещённый в интерфейс error, не равен nil.
-
Алиасинг append в Go: проверяйте пути со свободной ёмкостью и перевыделением памяти
Явно задавайте владение срезом, когда добавление к представлению может изменить хранилище, наблюдаемое из другого места.
-
Обработка ошибок в Go: обёртывание с %w, errors.Is и errors.As
Функции Go возвращают ошибки как обычные значения. Добавляйте контекст через fmt.Errorf и спецификатор %w, сохраняя доступ к исходной ошибке, затем проверяйте цепочку с помощью errors.Is для сигнальных значений и errors.As (или обобщённой errors.AsType) для типов, а не сравнением строк или оператором ==.
-
Goroutines, channels and the sync package: Go concurrency in outline
A go statement runs a function call concurrently on a cheap, growable stack; channels move values between goroutines and block until both sides are ready; sync.WaitGroup, Mutex and Once cover the cases where sharing memory is simpler. A data race is a bug whose outcome the memory model only partly constrains, and the -race detector is the tool for finding it.
-
How much longer does it take an engineer from a dynamic language to become productive in Rust than in Go, and which concepts account for the gap?
Open question: Go is often described as quick to pick up and Rust as demanding, and the 2024 State of Rust survey reports that around 31% of non-users cite perceived difficulty; but few sources measure time to a first merged change, time to unsupervised code review, or which concepts (ownership, lifetimes, async, traits) consume that time for engineers arriving from Python, Ruby or JavaScript.
-
Табличные тесты в Go с подтестами
Напишите одну тестовую функцию, которая перебирает срез именованных случаев и запускает каждый через t.Run. Случаи становятся данными; отдельный случай можно выбрать командой go test -run 'TestX/name', а t.Parallel, t.Helper и t.Cleanup помогают сохранить скорость и читаемость цикла.
-
Покрытие детектора гонок Go: чистый запуск ничего не говорит о невыполненных путях
Связывайте результаты go test -race с реально пройденными параллельными путями, включая запуск и завершение.
-
Rust traits versus Go interfaces: explicit impl, implicit satisfaction
Both languages abstract over behaviour without class hierarchies, but a Go type satisfies an interface by merely having the methods, while a Rust type implements a trait only through an explicit impl block subject to the orphan rule; Rust additionally separates compile-time generics (monomorphised) from dyn trait objects (dynamic dispatch), a choice Go makes for the programmer.
-
Модули Go: go.mod, go.sum и суффикс мажорной версии
Модуль Go — версионируемое дерево пакетов, описанное в go.mod. Команда go выбирает зависимости методом minimal version selection, проверяет загрузки по go.sum и требует суффикс вида /v2 в пути модуля для каждой мажорной версии выше 1, поэтому несовместимые версии имеют разные пути импорта.
-
Копирование мьютексов Go: сохраняйте идентичность блокировки вместе с защищаемым состоянием
Проверьте получатели методов по значению, присваивания и операции с контейнерами, способные скопировать структуру с уже используемым мьютексом.
Машиночитаемо: JSON