🚀 Go — идеально подходит для AI-агентов
Агент дорогим в использовании (например, из-за использования LLM), и часто требует взаимодействия с пользователем или другими агентами.
⚙️ Преимущества Go для работы с агентами:
- Go позволяет запускать тысячи горутин с минимальными накладными расходами, что идеально подходит для масштабируемых агентных систем.
- Общение через каналы: Go поощряет передачу данных через каналы, что упрощает синхронизацию и уменьшает вероятность ошибок, связанных с общим доступом к памяти.
- Контекстное управление: Механизм context.Context в Go обеспечивает централизованное управление отменой операций, что особенно полезно для долгоживущих процессов.
- Богатая стандартная библиотека: Go предоставляет обширный набор инструментов для работы с сетью, JSON, криптографией и другими аспектами, необходимыми для разработки агентов.
- Профилирование: Инструменты, такие как pprof, позволяют эффективно отслеживать и устранять утечки памяти и горутин.
🙅 Минусы:
— Мало библиотек для ML
— Нет "магии" как у Python-экосистемы
Но если тебе важны надежность, скорость и контроль, Go — это отличный выбор 🔥
📖 Читать полностью
Агент дорогим в использовании (например, из-за использования LLM), и часто требует взаимодействия с пользователем или другими агентами.
⚙️ Преимущества Go для работы с агентами:
- Go позволяет запускать тысячи горутин с минимальными накладными расходами, что идеально подходит для масштабируемых агентных систем.
- Общение через каналы: Go поощряет передачу данных через каналы, что упрощает синхронизацию и уменьшает вероятность ошибок, связанных с общим доступом к памяти.
- Контекстное управление: Механизм context.Context в Go обеспечивает централизованное управление отменой операций, что особенно полезно для долгоживущих процессов.
- Богатая стандартная библиотека: Go предоставляет обширный набор инструментов для работы с сетью, JSON, криптографией и другими аспектами, необходимыми для разработки агентов.
- Профилирование: Инструменты, такие как pprof, позволяют эффективно отслеживать и устранять утечки памяти и горутин.
🙅 Минусы:
— Мало библиотек для ML
— Нет "магии" как у Python-экосистемы
Но если тебе важны надежность, скорость и контроль, Go — это отличный выбор 🔥
📖 Читать полностью
🌀 Middleware и RoundTripper в Go: гибкая обработка HTTP-запросов
В Go нет встроенного понятия "middleware", как в других фреймворках — но вы можете легко реализовать его сами, особенно в контексте
🔧 RoundTripper — это интерфейс, который обрабатывает HTTP-запросы на уровне клиента (`http.Client`). Это даёт возможность внедрять логику *до* и *после* отправки запроса.
🧱 Пример: логгер запросов
📦 Использование:
💡 Таким образом, вы можете создавать middleware прямо внутри
• логирование
• кэширование
• модификация заголовков
• retry-логика
• трейсинг
🔗 Подробнее: dev.to/calvinmclean/middleware-and-roundtrippers-in-go-30pa
#golang #httpclient #middleware #webdev #devtools
В Go нет встроенного понятия "middleware", как в других фреймворках — но вы можете легко реализовать его сами, особенно в контексте
http.RoundTripper
.🔧 RoundTripper — это интерфейс, который обрабатывает HTTP-запросы на уровне клиента (`http.Client`). Это даёт возможность внедрять логику *до* и *после* отправки запроса.
🧱 Пример: логгер запросов
type LoggingRoundTripper struct {
rt http.RoundTripper
}
func (l *LoggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
log.Printf("📤 Запрос: %s %s", req.Method, req.URL)
resp, err := l.rt.RoundTrip(req)
if err == nil {
log.Printf("📥 Ответ: %d", resp.StatusCode)
}
return resp, err
}
📦 Использование:
client := &http.Client{
Transport: &LoggingRoundTripper{rt: http.DefaultTransport},
}
💡 Таким образом, вы можете создавать middleware прямо внутри
http.Client
, например:• логирование
• кэширование
• модификация заголовков
• retry-логика
• трейсинг
🔗 Подробнее: dev.to/calvinmclean/middleware-and-roundtrippers-in-go-30pa
#golang #httpclient #middleware #webdev #devtools
This media is not supported in your browser
VIEW IN TELEGRAM
Раньше: многоэтапные собеседования и тестовые
Сейчас: возможность получить оффер за один день!
Сбер зовёт Go-разработчиков на One Day Offer — он пройдёт 21 июня в онлайн-формате. Команда ищет будущих коллег в рекламную платформу SberAds сразу в несколько продуктов:
— Медийная реклама
— Performance Ads
— Инструменты разработки
— RTS
Регистрируйтесь на One Day Offer и будьте готовы к карьерным изменениям и работой над действительно масштабными задачами!
Сейчас: возможность получить оффер за один день!
Сбер зовёт Go-разработчиков на One Day Offer — он пройдёт 21 июня в онлайн-формате. Команда ищет будущих коллег в рекламную платформу SberAds сразу в несколько продуктов:
— Медийная реклама
— Performance Ads
— Инструменты разработки
— RTS
Регистрируйтесь на One Day Offer и будьте готовы к карьерным изменениям и работой над действительно масштабными задачами!
Отличный технический гайд — как на языке Go реализовать свой инструмент для анализа разделов диска (аналог `fdisk -l`), работая напрямую с «сырыми» байтами.
📌 Что делает утилита:
• Считывает первые 512 байт с диска (MBR)
• Определяет тип таблицы разделов: MBR или GPT
• Парсит нужные структуры (MBRPartition, GPTHeader и др.)
• Выводит информацию о каждом разделе: смещение, размер, активность, тип, имя (для GPT)
🔧 Поддерживается два формата:
1. MBR (Master Boot Record)
• До 4 основных разделов
• Ограничение — 2 ТБ
• Таблица находится в первом секторе (512 байт)
• Каждая запись — 16 байт, с полями CHS, LBA, типом и флагами
• В конце сигнатура
0x55AA
2. GPT (GUID Partition Table)
• Современный стандарт с поддержкой >2 ТБ
• Использует специальные GUID-идентификаторы
• Поддерживает до 128 разделов
• Содержит основной и резервный заголовки + таблицу с метаданными и именами разделов в UTF‑16
📖 Примеры кода в Go:
• Структуры описаны через
struct
с бинарными полями • Используется
binary.Read
для чтения блоков • Есть вспомогательные функции для расшифровки типов и конвертации размеров
Выводит таблицу всех разделов, включая размер, активность, смещение и, при GPT, имя раздела.
💡 Почему это полезно:
• Позволяет лучше понять, как устроена разметка дисков
• Учит читать бинарные форматы и парсить их в Go
• Подходит для системного программирования, утилит, диагностики и низкоуровневой работы с железом
🧪 Автор также упоминает возможные улучшения:
• Проверка CRC
• Поддержка расширенных и логических разделов
• Чтение заголовков файловых систем
• Реализация в WebAssembly для запуска в браузере
📎 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
Пейзаж программирования продолжает развиваться: языки Rust и Go бросают вызов традиционным парадигмам и удовлетворяют высокие требования современности. Оба находят важные ниши благодаря эффективной работе на уровне системы и возможностям в конкуренции blog.jetbrains.com.
Согласно данным отчёта State of Developer Ecosystem за 2024 год, Rust установил рекорд популярности — 2,27 млн. пользователей, из которых 709 000 используют его как основной язык. Пользователей Go стабильно много, и каждый шестой сейчас задумывается о переходе на Rust blog.jetbrains.com.
Выбор между ними зависит от требований проекта — будь то производительность, удобство или конкуренция. Давайте разберём оба языка.
📌 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Написание собственного Load Balancer всего за 250 строк кода
В свежей статье на *Beyond the Syntax* Sushant Dhiman показывает, как создать HTTP‑балансировщик нагрузки с нуля, используя всего ~250 строк Go-кода!
👨💻 Что в статье:
- Простой балансировщик, который принимает HTTP-запросы и распределяет их на пул серверов.
- Поддержка алгоритма round‑robin.
- Health‑checks: временно убирает из пула серверы, которые не отвечают.
- Как добавлять и убирать бэкенды динамически.
- Версия с конкурентной обработкой запросов.
🧩 Почему это полезно:
- Понятный, минималистичный код — отлично подойдёт для учебы и практики.
- Пошагово объясняется каждый компонент: от приёма соединений до проверок здоровья серверов.
- Реализация буквально «на коленке», без сложных фреймворков.
🚀 Итог:
Учебный, но практичный пример, как за минимальными усилиями и строками кода получить работующий Layer‑7 балансировщик. Отлично для новичков и тех, кто хочет вникнуть «под капот» инфраструктуры.
🔗 Читайте статью
@golang_books
В свежей статье на *Beyond the Syntax* Sushant Dhiman показывает, как создать HTTP‑балансировщик нагрузки с нуля, используя всего ~250 строк Go-кода!
👨💻 Что в статье:
- Простой балансировщик, который принимает HTTP-запросы и распределяет их на пул серверов.
- Поддержка алгоритма round‑robin.
- Health‑checks: временно убирает из пула серверы, которые не отвечают.
- Как добавлять и убирать бэкенды динамически.
- Версия с конкурентной обработкой запросов.
🧩 Почему это полезно:
- Понятный, минималистичный код — отлично подойдёт для учебы и практики.
- Пошагово объясняется каждый компонент: от приёма соединений до проверок здоровья серверов.
- Реализация буквально «на коленке», без сложных фреймворков.
🚀 Итог:
Учебный, но практичный пример, как за минимальными усилиями и строками кода получить работующий Layer‑7 балансировщик. Отлично для новичков и тех, кто хочет вникнуть «под капот» инфраструктуры.
🔗 Читайте статью
@golang_books
♟️ Новая шахматная библиотека на Go — chess v2
Разработчик Brigham Skarda представил chess v2 — лёгкую и мощную библиотеку для работы с шахматами на языке Go.
📦 Что умеет:
• Валидация и исполнение ходов
• Поддержка PGN и FEN
• Расчёт состояния: шах, мат, пат, троекратное повторение
• Работа с произвольных позиций
🔧 Отличия версии v2:
• Переработанный API с акцентом на читаемость и безопасность
• Повышенная производительность
• Улучшенная архитектура — удобна для использования в ИИ, анализаторах партий и игровых движках
🚀 Отличный инструмент для тех, кто пишет:
• шахматные движки
• телеграм-ботов
• шахматные редакторы и визуализаторы
🔗 Статья: https://brighamskarda.com/articles/introducing_chess_v2_a_new_chess_library_in_golang
#golang #chess #opensource #gamedev #библиотекиGo
Разработчик Brigham Skarda представил chess v2 — лёгкую и мощную библиотеку для работы с шахматами на языке Go.
📦 Что умеет:
• Валидация и исполнение ходов
• Поддержка PGN и FEN
• Расчёт состояния: шах, мат, пат, троекратное повторение
• Работа с произвольных позиций
🔧 Отличия версии v2:
• Переработанный API с акцентом на читаемость и безопасность
• Повышенная производительность
• Улучшенная архитектура — удобна для использования в ИИ, анализаторах партий и игровых движках
🚀 Отличный инструмент для тех, кто пишет:
• шахматные движки
• телеграм-ботов
• шахматные редакторы и визуализаторы
🔗 Статья: https://brighamskarda.com/articles/introducing_chess_v2_a_new_chess_library_in_golang
#golang #chess #opensource #gamedev #библиотекиGo
📝 Trumbowyg: лёгкий WYSIWYG-редактор для веб-разработчиков
🚀 Основные преимущества
• Мини-размер: ~30 KB JS (10 KB gzip) — мгновенная загрузка
• Простая инициализация:
• Семантический HTML без «вредных» обёрток
• Богатый набор кнопок: жирный, курсив, списки, ссылки, вставка изображений и многое другое
• Кроссбраузерность: IE9+ и все современные браузеры
🎯 Установка и подключение
• Подключи jQuery и стили/скрипты Trumbowyg
• Инициализируй редактор с параметрами:
🛠 Плагины и расширяемость
• Более 35 официальных плагинов: таблицы, эмодзи, автосохранение, автоподгонка высоты, fullscreen и др.
• Подключи плагин — инициализируй сразу после основного скрипта:
⚙️ Кастомизация
• Настраиваемые тулбары: создавай свои группы кнопок
• Локализации на более чем 45 языков
• Собственные модальные окна:
🌐 Когда выбирать Trumbowyg
• Если важна скорость загрузки и простота
• Для админок, CMS и лёгких веб-приложений
• Когда нужен чистый семантический код и минимальные зависимости
🔗 Полезные ссылки
• Документация и демо: https://alex-d.github.io/Trumbowyg/
• Репозиторий GitHub: https://github.com/Alex-D/Trumbowyg
🚀 Основные преимущества
• Мини-размер: ~30 KB JS (10 KB gzip) — мгновенная загрузка
• Простая инициализация:
$('#editor').trumbowyg();
• Семантический HTML без «вредных» обёрток
• Богатый набор кнопок: жирный, курсив, списки, ссылки, вставка изображений и многое другое
• Кроссбраузерность: IE9+ и все современные браузеры
🎯 Установка и подключение
• Подключи jQuery и стили/скрипты Trumbowyg
<link rel="stylesheet" href="dist/ui/trumbowyg.min.css">
<script src="dist/trumbowyg.min.js"></script>
• Инициализируй редактор с параметрами:
$('#editor').trumbowyg({
btns: [
['strong','em'],
['link','insertImage'],
['unorderedList','orderedList']
],
autogrow: true
});
🛠 Плагины и расширяемость
• Более 35 официальных плагинов: таблицы, эмодзи, автосохранение, автоподгонка высоты, fullscreen и др.
• Подключи плагин — инициализируй сразу после основного скрипта:
$.trumbowyg.plugins.autosave = {
fn: {
init: function(t) { /* … */ }
}
};
$('#editor').trumbowyg({ plugins: { autosave: { delay: 5000 } } });
⚙️ Кастомизация
• Настраиваемые тулбары: создавай свои группы кнопок
• Локализации на более чем 45 языков
• Собственные модальные окна:
var $modal = $('#editor').trumbowyg('openModal', {
title: 'Моё окно',
content: '<p>Любой HTML</p>'
});
$modal.on('tbwconfirm', () => $('#editor').trumbowyg('closeModal'));
🌐 Когда выбирать Trumbowyg
• Если важна скорость загрузки и простота
• Для админок, CMS и лёгких веб-приложений
• Когда нужен чистый семантический код и минимальные зависимости
🔗 Полезные ссылки
• Документация и демо: https://alex-d.github.io/Trumbowyg/
• Репозиторий GitHub: https://github.com/Alex-D/Trumbowyg
📁 Go: быстрая обработка гигантских файлов
Подход к обработке огромных файлов (миллионы строк) в Go: быстро, параллельно и без лишнего потребления памяти.
🔧 Идея: pipeline с каналами и воркерами
1. Читаем файл по строкам через bufio.Scanner
2. Передаём строки в батчах (например, по 100 000) в канал
3. Несколько горутин-воркеров обрабатывают эти батчи
4. Объединяем результаты и записываем/анализируем дальше
💡 Результаты:
• Последовательная обработка занимала ~19 секунд
• Параллельная (10 воркеров + batch size 100 000) — ~9 секунд
• Потребление памяти остаётся стабильным, даже на файлах 20+ ГБ
🛠 Почему это эффективно:
• Каналы позволяют читать и обрабатывать одновременно
• Батчи уменьшают количество аллокаций
• Возможна повторная инициализация []string через sync.Pool
• GC остаётся под контролем — без резких пиков
✅ Подходит для:
• CSV, JSONL, логов, текстовых потоков
• ETL-пайплайнов: чтение → обработка → сохранение
• Стриминговой обработки в аналитике и ML
📌 Советы:
• Используй runtime.NumCPU() для адаптивного количества воркеров
• Подбирай batchSize экспериментально (10–100 тыс строк)
•
Читать
Подход к обработке огромных файлов (миллионы строк) в Go: быстро, параллельно и без лишнего потребления памяти.
🔧 Идея: pipeline с каналами и воркерами
1. Читаем файл по строкам через bufio.Scanner
2. Передаём строки в батчах (например, по 100 000) в канал
3. Несколько горутин-воркеров обрабатывают эти батчи
4. Объединяем результаты и записываем/анализируем дальше
💡 Результаты:
• Последовательная обработка занимала ~19 секунд
• Параллельная (10 воркеров + batch size 100 000) — ~9 секунд
• Потребление памяти остаётся стабильным, даже на файлах 20+ ГБ
🛠 Почему это эффективно:
• Каналы позволяют читать и обрабатывать одновременно
• Батчи уменьшают количество аллокаций
• Возможна повторная инициализация []string через sync.Pool
• GC остаётся под контролем — без резких пиков
✅ Подходит для:
• CSV, JSONL, логов, текстовых потоков
• ETL-пайплайнов: чтение → обработка → сохранение
• Стриминговой обработки в аналитике и ML
📌 Советы:
• Используй runtime.NumCPU() для адаптивного количества воркеров
• Подбирай batchSize экспериментально (10–100 тыс строк)
•
Читать
Тимлид, вам слово📣 Приглашаем на митап по управлению командами
Воспользуйтесь летним затишьем, чтобы посмотреть на практику коллег, промониторить «погоду» в своей команде и, возможно, обновить стратегию работы. Обсудим дела тимлидские на офлайн-встрече TeamLead Talks в офисе Lamoda.
🤝 Обменяемся опытом, разберем кейсы командного управления и выберем лучшие решения.
🍕 Наладить непринужденное общение помогут нетворкинг-разогрев, игра «IT-бункер», закуски и напитки.
Присоединяйтесь к Team Lead Talks:
📅 2 июля в 19:00.
📍 Офлайн, Москва, офис Lamoda.
🔗Регистрируйтесь по ссылке, количество мест ограничено.
#реклама
О рекламодателе
Воспользуйтесь летним затишьем, чтобы посмотреть на практику коллег, промониторить «погоду» в своей команде и, возможно, обновить стратегию работы. Обсудим дела тимлидские на офлайн-встрече TeamLead Talks в офисе Lamoda.
🤝 Обменяемся опытом, разберем кейсы командного управления и выберем лучшие решения.
🍕 Наладить непринужденное общение помогут нетворкинг-разогрев, игра «IT-бункер», закуски и напитки.
Присоединяйтесь к Team Lead Talks:
📅 2 июля в 19:00.
📍 Офлайн, Москва, офис Lamoda.
🔗Регистрируйтесь по ссылке, количество мест ограничено.
#реклама
О рекламодателе
🔐 Непредвиденные уязвимости в парсерах Go
Go-разработчики нередко упускают из виду, как стандартные JSON / XML / YAML-парсеры могут быть использованы злоумышленниками, что приводит к обходу аутентификации и утечке данных.
1. Опасные теги при (un)marshal
* Поля без
* Неверные теги:
*
*
Решение: использовать
2. Несогласованность парсеров
* Дубликаты ключей: Go берёт последнее значение, другие парсеры — первое или ошибку.
* Регистронезависимый поиск:
* Unicode-подмена имён (`aKtionſ`) проходит незамеченной.
3. Путаница форматов
* XML-парсер Go игнорирует мусор до/после документа → JSON-внедрение.
* YAML-парсер принимает JSON как валидный YAML.
* Пример CVE-2020-16250 (Hashicorp Vault): JSON в XML-парсер → обход auth.
Рекомендации
* Жёсткий режим:
* JSON —
* YAML —
* Свой строгий парсер с проверкой дубликатов и case-collisions.
* Единый парсер и настройки во всех сервисах.
* Следить за безопасными дефолтами JSON v2 в Go.
* Использовать Semgrep для поиска рисков.
Ключевые выводы
1. Включить строгий парсинг.
2. Синхронизировать настройки во всех микросервисах.
3. Переходить на JSON v2, когда он стабилизируется.
4. Периодически запускать статический анализ (Semgrep).
Go-парсеры удобны, но при работе с недоверенными данными необходимы дополнительные меры.
📌 Читать
Go-разработчики нередко упускают из виду, как стандартные JSON / XML / YAML-парсеры могут быть использованы злоумышленниками, что приводит к обходу аутентификации и утечке данных.
1. Опасные теги при (un)marshal
* Поля без
json:"-"
участвуют в Unmarshal. * Неверные теги:
*
json:"-,omitempty"
— парсер ждёт ключ "-"
, поле остаётся доступным. *
json:"omitempty"
— имя поля становится "omitempty"
, модификатор не работает.Решение: использовать
json:"-"
и Semgrep-правила: trailofbits.go.unmarshal-tag-is-dash
и trailofbits.go.unmarshal-tag-is-omitempty
.2. Несогласованность парсеров
* Дубликаты ключей: Go берёт последнее значение, другие парсеры — первое или ошибку.
* Регистронезависимый поиск:
{"ACTION":"X"}
читается как Action
только в Go. * Unicode-подмена имён (`aKtionſ`) проходит незамеченной.
3. Путаница форматов
* XML-парсер Go игнорирует мусор до/после документа → JSON-внедрение.
* YAML-парсер принимает JSON как валидный YAML.
* Пример CVE-2020-16250 (Hashicorp Vault): JSON в XML-парсер → обход auth.
Рекомендации
* Жёсткий режим:
* JSON —
decoder.DisallowUnknownFields()
* YAML —
KnownFields(true)
* Свой строгий парсер с проверкой дубликатов и case-collisions.
* Единый парсер и настройки во всех сервисах.
* Следить за безопасными дефолтами JSON v2 в Go.
* Использовать Semgrep для поиска рисков.
Ключевые выводы
1. Включить строгий парсинг.
2. Синхронизировать настройки во всех микросервисах.
3. Переходить на JSON v2, когда он стабилизируется.
4. Периодически запускать статический анализ (Semgrep).
Go-парсеры удобны, но при работе с недоверенными данными необходимы дополнительные меры.
📌 Читать
🏎 Вы уже сталкивались с «глухими» зависаниями и гонками данных в Go? Настало время взять каналы под контроль!
💻 На открытом уроке «Подводные камни каналов в Go — и как их обходить» 1 июля в 20:00 МСК мы не просто обсудим, что такое каналы:
— покажем реальные кейсы;
— узнаем, где без них не обойтись;
— разберём частые ошибки, которые тормозят ваши сервисы.
🚀 Представьте: ваш сервис обрабатывает запросы параллельно, без блокировок и утечек. Вы глубоко понимаете, как каналы помогают строить конкурентный код и уверенно внедряете это на любом проекте.
👉 Регистрируйтесь сейчас и получите персональную скидку на курс «Golang Developer. Professional»: https://otus.pw/c5fC/?erid=2W5zFG7oqwN
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
💻 На открытом уроке «Подводные камни каналов в Go — и как их обходить» 1 июля в 20:00 МСК мы не просто обсудим, что такое каналы:
— покажем реальные кейсы;
— узнаем, где без них не обойтись;
— разберём частые ошибки, которые тормозят ваши сервисы.
🚀 Представьте: ваш сервис обрабатывает запросы параллельно, без блокировок и утечек. Вы глубоко понимаете, как каналы помогают строить конкурентный код и уверенно внедряете это на любом проекте.
👉 Регистрируйтесь сейчас и получите персональную скидку на курс «Golang Developer. Professional»: https://otus.pw/c5fC/?erid=2W5zFG7oqwN
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
Forwarded from Golang
«Go 1.25 interactive tour» — отличный обзор ключевых новинок, запланированных для Go 1.25 (релиз — август 2025)
Основные моменты:
1. Синтетическое время для тестов (synctest)
Новая библиотека testing/synctest позволяет использовать «фейковый» таймер для тестов, без реального ожидания:
🧪 Использование synctest.Test для "синтетического времени"
- synctest.Test(t, func(t *testing.T) {...}) запускает функцию в изолированном "пузыре", где:
- функции пакета time используют фиктивные часы;
- если все горутины заблокированы (например, time.Sleep, select без case), время продвигается вперед автоматически, чтобы "разблокировать" эти операции.
✅ Пример теста:
Здесь мы проверяем, что Read действительно отдает ошибку "timeout", без реального ожидания 60 секунд — synctest просто симулирует, что они прошли.
🕰 Как это работает?
Внутри synctest.Test:
- Время начинается с 2000-01-01T00:00:00Z;
- Когда все горутины заблокированы, время продвигается до следующего события (time.After, time.Sleep и т.д.);
- Это позволяет сразу активировать нужные ветки кода, которые зависят от времени, без настоящих задержек.
⚠️ Ограничения
Внутри synctest.Test нельзя использовать:
Пример неверного использования:
testing/synctest — это инструмент для тестирования кода, зависящего от времени, без реального ожидания, что делает тесты мгновенными и стабильными. Идеально подходит для timeout, retry, delays, ticker, и других случаев, когда вы хотите протестировать "прошло ли время", но не хотите реально ждать.
2. JSON v2 — серьезный апдейт
json/v2 вводит новые функции, включая MarshalToFunc, UnmarshalFromFunc и более гибкую систему маршаллинга с пользовательскими функциями.
Пример:
👉 Подробно можно почитать здесь
3. Container-aware GOMAXPROCS
Теперь Go учитывает ограничения CPU из cgroups – на Docker/Kubernetes GOMAXPROCS автоматически подстраивается под лимит, а не просто равен NumCPU
4. Новый сборщик мусора — Green Tea
Экспериментальный сборщик мусора оптимизирован для больших объёмов мелких объектов, обещают на 10–40 % снижение оверхеда. Включается через GOEXPERIMENT=greenteagc
5. Защита от CSRF (http.CrossOriginProtection)
Добавлен новый тип для отсечения запросов из кросс-доменных источников, анализируя заголовки Sec-Fetch-Site и Origin
6. sync.WaitGroup.Go
Упрощение работы c WaitGroup — теперь можно писать:
Вместо Add + Done
7. Flight Recorder (trace.FlightRecorder)
Flight recording — это способ отслеживать, что происходит в программе: какие функции вызываются, сколько памяти используется и другие важные события.
Но главное — эта запись ведётся не всё время, а только в «скользящем окне»: сохраняются только последние N секунд или последние N мегабайт данных.
👉 Это полезно, когда вы не знаете заранее, когда случится ошибка — flight recorder позволит «поймать» последние события перед сбоем.
8. Расширенные методы os.Root
Добавлены методы Chmod, Chown, Chtimes, Link, MkdirAll, RemoveAll, Rename, Symlink, ReadFile, WriteFile
9. reflect.TypeAssert
Упрощает преобразование reflect.Value в конкретный тип без промежуточного интерфейса.
10. hash.Cloner
Интерфейс клонирования состояния hash-функций (Clone()), поддерживается всеми реализациями STD (SHA-1, MD5 и др.)
📌 Полный обзор обновлений
@golang_google
Основные моменты:
1. Синтетическое время для тестов (synctest)
Новая библиотека testing/synctest позволяет использовать «фейковый» таймер для тестов, без реального ожидания:
🧪 Использование synctest.Test для "синтетического времени"
- synctest.Test(t, func(t *testing.T) {...}) запускает функцию в изолированном "пузыре", где:
- функции пакета time используют фиктивные часы;
- если все горутины заблокированы (например, time.Sleep, select без case), время продвигается вперед автоматически, чтобы "разблокировать" эти операции.
✅ Пример теста:
func TestReadTimeout(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
ch := make(chan int)
_, err := Read(ch)
if err == nil {
t.Fatal("expected timeout error, got nil")
}
})
}
Здесь мы проверяем, что Read действительно отдает ошибку "timeout", без реального ожидания 60 секунд — synctest просто симулирует, что они прошли.
🕰 Как это работает?
Внутри synctest.Test:
- Время начинается с 2000-01-01T00:00:00Z;
- Когда все горутины заблокированы, время продвигается до следующего события (time.After, time.Sleep и т.д.);
- Это позволяет сразу активировать нужные ветки кода, которые зависят от времени, без настоящих задержек.
⚠️ Ограничения
Внутри synctest.Test нельзя использовать:
t.Run(...)
t.Parallel()
t.Deadline()
Пример неверного использования:
synctest.Test(t, func(t *testing.T) {
t.Run("subtest", func(t *testing.T) {
t.Log("fail!") // это работать не будет
})
})
testing/synctest — это инструмент для тестирования кода, зависящего от времени, без реального ожидания, что делает тесты мгновенными и стабильными. Идеально подходит для timeout, retry, delays, ticker, и других случаев, когда вы хотите протестировать "прошло ли время", но не хотите реально ждать.
2. JSON v2 — серьезный апдейт
json/v2 вводит новые функции, включая MarshalToFunc, UnmarshalFromFunc и более гибкую систему маршаллинга с пользовательскими функциями.
Пример:
json.Marshal(vals, json.WithMarshalers(marshalers))
👉 Подробно можно почитать здесь
3. Container-aware GOMAXPROCS
Теперь Go учитывает ограничения CPU из cgroups – на Docker/Kubernetes GOMAXPROCS автоматически подстраивается под лимит, а не просто равен NumCPU
4. Новый сборщик мусора — Green Tea
Экспериментальный сборщик мусора оптимизирован для больших объёмов мелких объектов, обещают на 10–40 % снижение оверхеда. Включается через GOEXPERIMENT=greenteagc
5. Защита от CSRF (http.CrossOriginProtection)
Добавлен новый тип для отсечения запросов из кросс-доменных источников, анализируя заголовки Sec-Fetch-Site и Origin
6. sync.WaitGroup.Go
Упрощение работы c WaitGroup — теперь можно писать:
wg.Go(func() { /* … */ })
wg.Wait()
Вместо Add + Done
7. Flight Recorder (trace.FlightRecorder)
Flight recording — это способ отслеживать, что происходит в программе: какие функции вызываются, сколько памяти используется и другие важные события.
Но главное — эта запись ведётся не всё время, а только в «скользящем окне»: сохраняются только последние N секунд или последние N мегабайт данных.
👉 Это полезно, когда вы не знаете заранее, когда случится ошибка — flight recorder позволит «поймать» последние события перед сбоем.
8. Расширенные методы os.Root
Добавлены методы Chmod, Chown, Chtimes, Link, MkdirAll, RemoveAll, Rename, Symlink, ReadFile, WriteFile
9. reflect.TypeAssert
Упрощает преобразование reflect.Value в конкретный тип без промежуточного интерфейса.
10. hash.Cloner
Интерфейс клонирования состояния hash-функций (Clone()), поддерживается всеми реализациями STD (SHA-1, MD5 и др.)
📌 Полный обзор обновлений
@golang_google