Перейти к содержимому
Технологии IT обновлён 26.12.2021

Библиотека Go разработчика

Библиотека Go разработчика — это источник полезной информации для разработчиков на Go.

Здесь вы найдёте материалы по различным темам, помогающим развиваться в профессии.

Присоединяйтесь!

Публикации канала

SQL тормозит? Сначала посмотрите на очередь пула sql.DB — пул соединений. Когда достигнут SetMaxOpenConns, следующая операция ждёт свободное соединение, ещё не выполняя SQL. У db.Stats() есть InUse, Idle и накопительные WaitCount, WaitDuration. Сравните счётчики в начале и конце интервала: растут ли ожидания вместе с задержкой сервиса? Это время ожидания соединения, а не выполнения запроса в БД. Не повышайте лимит вслепую. Учитывайте возможности БД и число реплик сервиса. SetMaxIdleConns управляет оставленными свободными соединениями, а не общим потолком. Управление пулом 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

Тело запроса слишком большое. Не маскируйте это под EOF io.LimitReader прекращает чтение на лимите, как будто данные закончились. Для входящего HTTP-body есть http.MaxBytesReader(w, r.Body, n): попытка прочитать сверх лимита возвращает *http.MaxBytesError. Оберните r.Body до чтения. Превышение проверяется именно при чтении, а не при создании обёртки. Один json.Decoder.Decode может оставить хвост непрочитанным. Обработчик сам распознаёт ошибку и выбирает ответ 413. Лимит байтов не заменяет таймаут чтения. Документация MaxBytesReader 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

Динозавр держится за ВМ и снапшоты по расписанию, Археолог давно не помнит, что и где у него крутится, а Повелителю облаков уютно до первого кругленького счёта. Это три из десяти типов инфраструктуры в тесте от команды Deckhouse. Ответьте на 5 вопросов, узнайте свой тип и отправьте ссылку на результат команде. Посмотрим, совпадёт ли он у коллег. → Пройти тест и узнать свой тип

Открыть в Telegram

Fuzzing нашёл ошибку. Сохраните вход вместе с исправлением Обычный go test запускает fuzz-тест на исходном корпусе: входах из f.Add и файлов testdata/fuzz. Новые входы в этом режиме не генерируются. Активный поиск нужно включить отдельно. Если в пакете один fuzz-тест, короткий запуск выглядит так: go test -fuzz=. -fuzztime=10s Если их несколько, вместо точки задайте регулярное выражение, которое выбирает ровно один. Движок меняет входы и использует покрытие кода, чтобы находить новые пути выполнения. Но проверяемое свойство задаёт автор теста. Например, после кодирования и обратного декодирования должны получиться исходные данные. При сбое Go пытается уменьшить вход, сохранив ошибку, и записывает его в подкаталог testdata/fuzz с именем теста. Путь и команду точечного повторного запуска он выводит в терминал. После исправления запустите go test и добавьте найденный файл в репозиторий вместе с кодом. Этот вход станет регрессионной проверкой и будет выполняться без нового fuzzing-запуска. А вот интересные входы из кеша $GOCACHE/fuzz используются только при активном поиске. Десять секунд без падений не доказывают отсутствие ошибок. Сам fuzz-target должен быть быстрым, детерминированным и не зависеть от изменяемого глобального состояния. Как Go хранит корпус и воспроизводит сбои 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше. В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок. Например, можно совместить два направления по работе с ИИ: 💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью. 💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений. 📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета. А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога. Акция действует до 31 октября включительно ⏳ ⏮️ Пора прокачать свой стек

Открыть в Telegram

Тест упал. Покажите, что именно разошлось Два больших объекта в логе приходится сравнивать глазами. cmp.Diff(want, got) из go-cmp показывает различия, в том числе во вложенных структурах. Пустая строка означает, что значения равны по выбранным правилам. Мини-пример для файла tags_test.go. Здесь разные вторые элементы, поэтому тест намеренно падает: package example import ( "testing" "github.com/google/go-cmp/cmp" ) func TestTags(t *testing.T) { want := []string{"go", "sql"} got := []string{"go", "http"} diff := cmp.Diff(want, got) if diff != "" { t.Errorf("tags mismatch (-want +got):\n%s", diff) } } При таком порядке аргументов строки с - относятся к ожидаемому значению, с + — к полученному. Сам формат diff нестабилен: он для чтения человеком, а не для парсинга. Правила равенства тоже часть теста. По умолчанию nil и пустой слайс различаются. Опция cmpopts.EquateEmpty() уравнивает слайсы и map нулевой длины, но добавлять её стоит только тогда, когда API действительно не различает эти состояния. Неэкспортируемые поля без подходящего правила сравнения могут вызвать панику. cmp.Diff • EquateEmpty 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

singleflight: один запрос к источнику вместо одинаковых параллельных Кеш опустел, и несколько обработчиков одновременно пошли за одним товаром в БД. Пока первый запрос ещё работает, остальные повторяют ту же работу. Для такой ситуации есть golang.org/x/sync/singleflight. Вызов Group.Do(key, fn) объединяет обращения с одинаковым ключом: выполняется одна функция, остальные ждут и получают её результат вместе с ошибкой. Ключи разные — работа идёт независимо. Все обработчики должны использовать одну и ту же Group, а не создавать её заново на каждый запрос. Ключ описывает всё, от чего зависит результат. Если данные различаются между арендаторами, одного ID товара мало. Например, tenant:42:product:7 отделяет его от такого же товара другого арендатора. Готовый результат singleflight не хранит: следующий вызов после завершения работы снова запустит функцию. Механизм действует внутри одного процесса и не ограничивает общее число запросов по разным ключам. А флаг shared сообщает, что результат получили несколько вызовов, а не что сработал кеш. Документация singleflight 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

💾 Команда Dolt ускорила WAL сочетанием fdatasync и записи нулей Заменить fsync на fdatasync оказалось недостаточно. Команда Go-базы Dolt также стала заранее записывать 4 МиБ нулей при расширении журнала. Следующие записи перезаписывают готовую область, реже требуя синхронизации метаданных. Во внутренних тестах небольших последовательных записей это дало 10–40% прироста. Помогло сочетание Ext4 и сетевого диска с заметной задержкой, но свободной пропускной способностью. На Btrfs и OpenZFS такого выигрыша не увидели. А предварительная запись нулей увеличивает объём записи — вплоть до двух раз. При упоре в пропускную способность оптимизация может навредить. Полезный разбор для тех, кто пишет хранилища и журналы на Go. На дату статьи изменение было в main, но ещё не вошло в релиз Dolt. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция! До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один. Например, можно совместить: 💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью. 💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений. Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥 Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога. Акция действует до 31 октября включительно ⏳ ⏬ Собрать свой учебный билд

Открыть в Telegram

⚙️ Go 1.27 открывает SIMD-инструкции ARM и WebAssembly без ассемблера Переносимый SIMD скрывает различия процессоров. Но для специфических операций есть более низкий уровень — экспериментальный simd/archsimd. В Go 1.27 к amd64 добавились arm64 и wasm. Эксперимент включается при сборке: GOEXPERIMENT=simd go build При переносе алгоритма важны крайние случаи. Например, PermuteOrZero на amd64 и LookupOrZero на ARM/wasm по-разному обрабатывают индексы вне диапазона. Поэтому похожие операции получили разные имена. Это инструмент для измеренных горячих участков: обработки байтов, чисел и векторов. Проверки доступности инструкций и запасной путь остаются частью реализации. API экспериментальный; обычные циклы от включения флага автоматически не векторизуются. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

🛠 gopls спрашивает, какие теги добавить полям структуры Раньше действие Add struct tags добавляло json-теги в camelCase. Теперь gopls умеет уточнять параметры: например, выбрать json,yaml,db и snake_case. Ставите курсор на структуру, вызываете действие, отвечаете на два вопроса — сервер генерирует теги для её полей. При удалении тоже можно выбрать конкретные ключи, сохранив остальные. Для интерактивной работы команда рекомендует gopls 0.24.0 и Go-расширение VS Code 0.56.0. Одного обновления сервера недостаточно: редактор должен поддерживать новые диалоги. В статье показаны и другие сценарии, но их статус различается. Перенос объявлений демонстрируется как preview, а изменение сигнатуры пока в планах. Проверяйте доступность нужного действия, прежде чем рассчитывать на него в рабочем процессе. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

🌐 Go 1.27: закрыли Body — соединение ещё пригодится Клиенту нужен только статус ответа, поэтому тело он не читает. До Go 1.26 включительно вызов resp.Body.Close() в таком HTTP/1-запросе приводил к закрытию соединения. Следующий запрос снова платил за TCP и TLS. В Go 1.27 Transport после Close асинхронно дочитывает ненужное тело: не более 256 КиБ и не дольше 50 мс. Если успеет, соединение можно использовать повторно. При Connection: close дочитывание пропускается. 🔴 Даже успешный JSON Decode не всегда читает тело до конца: после объекта может остаться перевод строки. Для HTTP/1 это тоже мешало повторному использованию соединения. Команда Go теперь рекомендует просто закрывать Body, когда оно больше не нужно. Повторное использование не гарантируется: действуют лимиты дочитывания и условия соединения. HTTP/2 использует отдельные потоки, поэтому такого дочитывания не требует. ➡️ Как это устроено в net/http 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

🔎 ReverseProxy: заголовок добавили, а backend его не увидел Прокси записывает X-App-User в Director. Клиент присылает Connection: X-App-User — и до backend заголовок уже не доходит. Причина в порядке обработки: hop-by-hop заголовки удаляются после вызова Director. Клиент может перечислить их в Connection, включая поле, которое добавил сам прокси. С Rewrite порядок другой: сначала очистка, затем callback. Добавленный в r.Out.Header заголовок сохраняется. Менять входящий r.In нельзя. В локальном тесте backend получил пустую строку с Director и proxy-user с Rewrite. Оба сценария — на Go 1.27.2. В текущей документации Director помечен устаревшим, для нового кода рекомендуется Rewrite. ➡️ Порядок обработки ReverseProxy 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

🔎 go test запускает и код зависимостей Загрузка Go-модуля не выполняет его init(). Но когда зависимость импортирована в тестовый бинарник, её инициализация запускается до тестов — с доступом к окружению процесса. Жюль Робино проверил это на собственной тестовой зависимости: при сборке она молчала, а во время go test её init() прочитал переменные окружения. 🔴 Если тестовый job получает ключ деплоя, импортированная зависимость тоже может к нему обратиться. Автор предлагает разделять тесты и публикацию, выдавая каждому job только нужные полномочия. Проверять стоит и новые зависимости. govulncheck ищет известные уязвимости, а capslock показывает возможности кода и пути вызовов: доступ к сети, файлам, запуск процессов. Неожиданная возможность — повод изучить её использование. Контрольная сумма подтверждает целостность модуля, но сама по себе не доказывает безопасность его поведения. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

🧪 Зелёный тест ещё нужно проверить Функция IsSorted должна отличать отсортированный слайс от неотсортированного. Один тест на [1, 2, 3] пропустит реализацию, которая всегда возвращает true. В разборе TDD на Go Джон Арундел сначала пишет тест и минимальную реализацию с return false. Тест компилируется и падает: теперь видно, что он реагирует на эту ошибку. Затем автор добавляет неотсортированный вход и постепенно расширяет набор случаев. Повторяющиеся числа проверяют допустимость равных соседей, отрицательные — ошибочную начальную границу, пустой слайс — обращение к несуществующему элементу. 🔴 Каждый найденный баг сначала получает падающий тест, затем исправление. Зелёный прогон показывает соответствие проверенным случаям; полноту набора нужно оценивать отдельно. Самописная IsSorted здесь служит упражнением по TDD. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

💡 slog: убираем секретный атрибут до записи лога Токен не должен попадать в лог, но приходит вместе с остальными полями запроса. У стандартных JSONHandler и TextHandler есть HandlerOptions.ReplaceAttr: callback преобразует атрибут перед записью. Возврат пустого slog.Attr{} удаляет поле. Фильтр на карточке убирает access_token и внутри группы auth, сохраняя соседний user. Названия открытых групп доступны в аргументе groups. 🔴 Этот пример проверяет имя ключа. Если секрет уже вставлен в текст сообщения, например token=demo-secret, он останется в msg. Передавайте чувствительные данные отдельными атрибутами и продумывайте фильтр для своей схемы логов. ➡️ Документация ReplaceAttr 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

Forwarded From 🧑‍💻 Какие навыки помогают вам в разработке в 2026 году? Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно? Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему. Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании. 👉 Пройти опрос

Открыть в Telegram

🧪 Тестируем файловый код без временных каталогов Функция читает файлы? Если она принимает fs.FS, в тест можно передать fstest.MapFS: пути и содержимое задаются прямо в map. Родительские каталоги создаются в этой модели автоматически. В примере на карточке два файла. banner.txt читается как hello, а отсутствующий путь возвращает ошибку, которую можно проверить через errors.Is(err, fs.ErrNotExist). fstest.TestFS проверяет поведение файловой системы и наличие перечисленных файлов. Содержимое и логику вашей функции нужно проверять отдельно. 🔴 Не меняйте map одновременно с файловыми операциями: это data race. Для большой файловой системы такая модель неудобна — обход каталогов перебирает всю map. ➡️ MapFS и TestFS в документации 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

🔄 NATS 2.15: перенос потока JetStream можно отменить Поток JetStream уже переносится между узлами, а план размещения изменился. В NATS 2.15 появился отдельный API для отмены такого переноса: $JS.API.STREAM.CANCEL_MOVE Операция возвращает поток к исходному размещению. Новый механизм согласования желаемого состояния также делает безопаснее изменения размещения и числа реплик во время переноса. 🔴 Для обслуживания узлов добавили API эвакуации потоков и их consumers. Это позволяет перенести данные и состояние перед работами на сервере. Изменения полезны командам, чьи Go-сервисы используют JetStream для устойчивого обмена сообщениями. Перед обновлением проверьте совместимость с 2.14: у релиза есть отдельное руководство по переходу. ➡️ Новые API и изменения NATS 2.15 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

🛠 garble 0.18: меньше сведений об исходнике в Go-бинарнике Go-бинарник сохраняет имена и другую информацию, полезную для диагностики. garble меняет сборку так, чтобы извлечь из неё сведения об исходном коде было сложнее. Версия 0.18 поддерживает Go 1.27; поддержка Go 1.26 в ней убрана. По оценке авторов, сборка ускорилась на 10–15%: подготовка изменённого линкера теперь идёт параллельно со сбором списка пакетов. 🔴 Экспериментальная обфускация потока управления стала воспроизводимой при заданном -seed и поддерживает больше конструкций языка. Обычная команда: garble build ./... Флаг -tiny удаляет ещё больше диагностической информации, но усложняет разбор аварий: сообщения panic и стектрейсы не печатаются. ➡️ Изменения и исправления garble 0.18 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика

Открыть в Telegram

Комментарии

0

Комментарии пишут вошедшие — так видно, кто автор.

Войти

Комментариев пока нет

Будьте первым, кто расскажет о канале другим.

Пожаловаться на канал

Расскажите, что не так: модератор проверит канал и примет решение. Подпись не нужна, но почту можно оставить — тогда ответим.

Причина Что не так (необязательно) Почта для ответа (необязательно)
Открыть в Telegram