Forwarded from Go Update
🔥 weak: new package providing weak pointers 🔥
Соскучались по интересным изменениям? Их есть у меня!
Начиная с Go 1.24 у нас появится пакет который даст там т.н. "слабые указатели". Суть этих указателей заключается в том, что сборщик мусора вправе в любой момент времени собрать данные на которые они указывают. Т.е. сделать их указатели невалидными.
Простой пример кода:
На самом деле эти указатели появились еще с приходом пакета unique о котором я писал ранее. Но затащить два пакета в рамках одного proposal'а нельзя, поэтому пришлось ждать Go 1.24. Go Core Team (и в особенности Расс Кокс) очень долго сопротивлялись добавлению этого вида указателей в язык, т.н. они ломают абстракцию со сборщиком мусора и имеют очень неочевидные механики взаимодействия с
Основной плюс этого пакета в том, что разработчикам кешей стало намного легче собирать мусор. Даже человек, который слабо помнит алгоритмы, теперь может реализовать LRU кеши элементарно на мапах. Как именно? А вот это я покажу в сообщении о следующем за этим изменении.
Соскучались по интересным изменениям? Их есть у меня!
Начиная с Go 1.24 у нас появится пакет который даст там т.н. "слабые указатели". Суть этих указателей заключается в том, что сборщик мусора вправе в любой момент времени собрать данные на которые они указывают. Т.е. сделать их указатели невалидными.
Простой пример кода:
weakPtr := weak.Make(&SomeStruct{someData})
runtime.GC()
println(weakPtr.Pointer() == nil) // может быть true, а может и false
На самом деле эти указатели появились еще с приходом пакета unique о котором я писал ранее. Но затащить два пакета в рамках одного proposal'а нельзя, поэтому пришлось ждать Go 1.24. Go Core Team (и в особенности Расс Кокс) очень долго сопротивлялись добавлению этого вида указателей в язык, т.н. они ломают абстракцию со сборщиком мусора и имеют очень неочевидные механики взаимодействия с
finalizers
. Однако после добавление пакета unique отрицать необходимость (хоть и редкую) такой вещи стало невозможно, поэтому было принято решение дать ее использовать всем.Основной плюс этого пакета в том, что разработчикам кешей стало намного легче собирать мусор. Даже человек, который слабо помнит алгоритмы, теперь может реализовать LRU кеши элементарно на мапах. Как именно? А вот это я покажу в сообщении о следующем за этим изменении.
pkg.go.dev
weak package - internal/weak - Go Packages
The weak package is a package for managing weak pointers.
Как писать качественные unit-тесты
https://habr.com/ru/articles/854546/
Немного про unit-тесты и как их прокачать: что такое мутационные тесты и зачем они нужны, что такое стабы и моки, в чем опасность использования моков и др.
Если вы уже умеете писать unit-тесты, но дальнейшие шаги пока не делали, статья вам будет полезна.
https://habr.com/ru/articles/854546/
Немного про unit-тесты и как их прокачать: что такое мутационные тесты и зачем они нужны, что такое стабы и моки, в чем опасность использования моков и др.
Если вы уже умеете писать unit-тесты, но дальнейшие шаги пока не делали, статья вам будет полезна.
Хабр
Как писать качественные unit-тесты: процент покрытия, мутанты и работа с моками
Привет, Хабр! Меня зовут Марина, я Backend-инженер в компании Авито. Сегодня я хочу поделиться собственными рекомендациями, к которым удалось прийти при работе над качеством тестового покрытия...
Автоматизация напоминаний клиентам
https://habr.com/ru/companies/exolve/articles/861346/
Туториал по созданию системы автоматических напоминаний. Как обучающий материал, вполне неплохо.
Но для более серьёзного использования выглядит плохо. Ниже я объясняю почему, плюс подписчик в комментах добавил ещё замечаний, за что ему отдельная благодарность.
В чём суть: клиент соглашается на что-то во время разговора, и через месяц автоматически получает SMS-напоминание.
Технически это реализовано через связку звонка и транскрибации (Exolve API), анализа текста, планирования и отправки SMS. Всё на Go + SQLite.
————
Теперь позволю себе немного покритиковать текст:
1) При поиске согласия не учитывается контекст: просто ищутся слова "да", "согласен", "конечно" где угодно в тексте. Но диалог может быть таким:
- Вам интересно?
- Да, но сейчас не готов
Или:
- Раньше было да, а сейчас нет
И система посчитает это за согласие
2) Отправка SMS планируется в памяти, с помощью
Нужно хранить задачи на отправку (не только общую инфу) в базе и использовать какой-то планировщик.
3) Отсутствие учёта часовых поясов: SMS отправляются ровно через месяц без учёта времени клиента. Можно разбудить человека в 3 часа ночи.
Также стоило бы написать пару слов по поводу аутентификации веб-хука.
Я понимаю, что это может быть очень упрощённый пример, но в таком случае стоило хотя бы оговорку сделать.
#automation #sqlite
https://habr.com/ru/companies/exolve/articles/861346/
Туториал по созданию системы автоматических напоминаний. Как обучающий материал, вполне неплохо.
Но для более серьёзного использования выглядит плохо. Ниже я объясняю почему, плюс подписчик в комментах добавил ещё замечаний, за что ему отдельная благодарность.
В чём суть: клиент соглашается на что-то во время разговора, и через месяц автоматически получает SMS-напоминание.
Технически это реализовано через связку звонка и транскрибации (Exolve API), анализа текста, планирования и отправки SMS. Всё на Go + SQLite.
————
Теперь позволю себе немного покритиковать текст:
1) При поиске согласия не учитывается контекст: просто ищутся слова "да", "согласен", "конечно" где угодно в тексте. Но диалог может быть таким:
- Вам интересно?
- Да, но сейчас не готов
Или:
- Раньше было да, а сейчас нет
И система посчитает это за согласие
2) Отправка SMS планируется в памяти, с помощью
time.AfterFunc
: если сервис перезапустится, все запланированные сообщения пропадут.Нужно хранить задачи на отправку (не только общую инфу) в базе и использовать какой-то планировщик.
3) Отсутствие учёта часовых поясов: SMS отправляются ровно через месяц без учёта времени клиента. Можно разбудить человека в 3 часа ночи.
Также стоило бы написать пару слов по поводу аутентификации веб-хука.
Я понимаю, что это может быть очень упрощённый пример, но в таком случае стоило хотя бы оговорку сделать.
#automation #sqlite
Хабр
«Напомните через месяц?»: как автоматизировать напоминания клиентам с Golang, SQLite и вебхуками
Привет, Хабр! Представим ситуацию: вы клиент. Разговор с менеджером завершён, он предложил вам что-то полезное — услугу, продукт или подписку — и, допустим, вы соглашаетесь: «Почему бы и нет, отличная...
Go 1.23: Interactive release notes
https://antonz.org/go-1-23/
Ещё немного про v1.23. Недавно мне скинули вот такую крутую страничку, где про новведения не только можно почитать, но и потыкать не отходя от кассы. Очень удобно.
Ну и текст написан хорошо.
Лучи добра и уважения автору❤️
#go_1_23
https://antonz.org/go-1-23/
Ещё немного про v1.23. Недавно мне скинули вот такую крутую страничку, где про новведения не только можно почитать, но и потыкать не отходя от кассы. Очень удобно.
Ну и текст написан хорошо.
Лучи добра и уважения автору
#go_1_23
Please open Telegram to view this post
VIEW IN TELEGRAM
antonz.org
Go 1.23 interactive tour
Iterators, timers and canonical values.
Golang Дайджест
Please open Telegram to view this post
VIEW IN TELEGRAM
Сколько памяти нужно в 2024 году для выполнения миллиона конкурентных задач?
https://habr.com/ru/articles/862482/
Забавное исследование, но комментировать я его, пожалуй, не буду🌚
https://habr.com/ru/articles/862482/
Забавное исследование, но комментировать я его, пожалуй, не буду
Please open Telegram to view this post
VIEW IN TELEGRAM
Готовим слайсы в Go: подробно о динамических массивах, строчках и ускорении
https://habr.com/ru/companies/yadro/articles/874480/
Ещё одна неплохая и очень подробная статья про слайсы с глубоким погружением.
Что разобрано:
- Внутреннее устройство слайсов и как растёт их capacity. Также затронут интересный момент про округление вместимости из-за особенностей хранения объектов в хипе, про который редко пишут
- Разные способы создания слайсов и когда какой вариант лучше (пустой слайс,
- Передача слайсов в функции: по значению vs по указателю
- Работа со строками, конкатенация и оптимизации компилятора
- Подробный разбор
- Тонкости копирования при
- Использование
- Сравнение разных способов конкатенации строк на больших и маленьких объёмах данных
И много ещё интересного.
Особенно порадовали бенчмарки в конце с неожиданными результатами — strings.Join() может работать эффективнее чем bytes.Buffer.
В общем, рекомендую к прочтению👾
#performance #slices #strings #article
https://habr.com/ru/companies/yadro/articles/874480/
Ещё одна неплохая и очень подробная статья про слайсы с глубоким погружением.
Что разобрано:
- Внутреннее устройство слайсов и как растёт их capacity. Также затронут интересный момент про округление вместимости из-за особенностей хранения объектов в хипе, про который редко пишут
- Разные способы создания слайсов и когда какой вариант лучше (пустой слайс,
make(len)
, make(0, cap)
и т.д.).- Передача слайсов в функции: по значению vs по указателю
- Работа со строками, конкатенация и оптимизации компилятора
- Подробный разбор
bytes.Buffer
vs strings.Builder
и их особенностей- Тонкости копирования при
[]byte → string
и обратно- Использование
sync.Pool
для переиспользования памяти — как не забыть "вернуть" объект в пул и почему со strings.Builder
это не работает- Сравнение разных способов конкатенации строк на больших и маленьких объёмах данных
И много ещё интересного.
Особенно порадовали бенчмарки в конце с неожиданными результатами — strings.Join() может работать эффективнее чем bytes.Buffer.
В общем, рекомендую к прочтению
#performance #slices #strings #article
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Готовим слайсы в Go: подробно о динамических массивах, строчках и ускорении
Привет, Хабр! Меня зовут Владислав Белогрудов, я работаю в команде разработки интерфейсов и сервисов управления в YADRO. Мой текущий проект — информационная система на Go. В рамках проекта я...
Как ускорить свой код с помощью системы непрерывного профилирования Perforator
https://habr.com/ru/companies/yandex/articles/875070
Perforator — это система непрерывного профилирования, которую разработали в Яндексе и недавно выложили в опенсорс. Да, проект написан на C++, а не на Go, но тут интересен сам инструмент, а не его исходный код.
Что интересного рассказывают в статье:
– Как работает Perforator и как его использовать
– Как интерпретировать результаты профилирования
– Как оптимизировать код на основе данных профилирования
А чем интересен сам Perforator:
- Система умеет профилировать как компилируемые языки (C++, Go, Rust), так и интерпретируемые (Python 3.12+)
- Поддерживает FDO (Feedback-driven optimization) — можно автоматически использовать профили для оптимизации новых сборок. По бенчмаркам даёт до 10% прироста производительности
- Интересная фича — профилирование по срезам для A/B-тестов через thread-local теги
- Можно использовать как распределённо (в K8s), так и локально вместо perf record
Из ограничений:
- Нужен root (CAP_SYS_ADMIN)
- Только Linux 5.4+ на x86-64
- ARM пока в разработке
- На больших хостах может съедать несколько GB RAM
————
Зачем мне это, если у нас в Go есть pprof?
Очень полезно смотреть, какие ещё бывают решения, хотя бы в образовательных целях, и не зацикливаться на чём-то одном.
А здесь можно глянуть визуализацию работы сервиса✨
#profiling #performance #ebpf #opensource
https://habr.com/ru/companies/yandex/articles/875070
Perforator — это система непрерывного профилирования, которую разработали в Яндексе и недавно выложили в опенсорс. Да, проект написан на C++, а не на Go, но тут интересен сам инструмент, а не его исходный код.
Что интересного рассказывают в статье:
– Как работает Perforator и как его использовать
– Как интерпретировать результаты профилирования
– Как оптимизировать код на основе данных профилирования
А чем интересен сам Perforator:
- Система умеет профилировать как компилируемые языки (C++, Go, Rust), так и интерпретируемые (Python 3.12+)
- Поддерживает FDO (Feedback-driven optimization) — можно автоматически использовать профили для оптимизации новых сборок. По бенчмаркам даёт до 10% прироста производительности
- Интересная фича — профилирование по срезам для A/B-тестов через thread-local теги
- Можно использовать как распределённо (в K8s), так и локально вместо perf record
Из ограничений:
- Нужен root (CAP_SYS_ADMIN)
- Только Linux 5.4+ на x86-64
- ARM пока в разработке
- На больших хостах может съедать несколько GB RAM
————
Зачем мне это, если у нас в Go есть pprof?
Очень полезно смотреть, какие ещё бывают решения, хотя бы в образовательных целях, и не зацикливаться на чём-то одном.
А здесь можно глянуть визуализацию работы сервиса
#profiling #performance #ebpf #opensource
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Perforator: новая система непрерывного профилирования теперь в опенсорсе
Привет! Сегодня мы выложили в опенсорс Perforator — систему непрерывного профилирования (continuous profiling), которую используем внутри Яндекса для анализа производительности...
https://habr.com/ru/articles/878766/
Если вам лень было тестить как DeepSeek-R1 пишет код на Go, то автор статьи сделал это за вас, сравнив с GPT-o1. Правда, для примера взят не какой-то привычный рабочий сервис, а простенькие игры — "Пинг-Понг" и "Крестики-нолики". Но тем веселее.
Краткие итоги
Пинг-Понг:
- DeepSeek: сделал более структурированный код (game struct + vector), добавил счёт
- ChatGPT: использовал глобальные переменные, но сделал динамический размер поля
- Обе версии: используют termbox и в целом играбельны
Крестики-нолики:
- DeepSeek: использовал
[]rune
для поля и добавил очистку экрана через ANSI- ChatGPT: сделал более простую версию со slice of strings, но всё в main()
- Обе версии: корректно проверяют победу, хотя и разными подходами
Интересно, что в обоих случаях DeepSeek немного "заботливее" к пользователю — добавляет счёт, чистит экран. А ChatGPT больше фокусируется на технических моментах вроде динамического размера.
P.S.: Не хватает сравнения с Claude 3.5 Sonnet, мне он нравится намного больше, чем любая модель GPT
————
UPD: ещё одна похожая статья с их сравнением от подписчика (из комментов)
#ai #gamedev #gpt #deepseek
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Сравнение кода DeepSeek и ChatGPT(Golang)
Весь этот шум заставил меня заинтресоваться DeepSeek. Самое банальное сравнить с ChatGPT. Ну и плюсом, у меня сегодня выходной, можно и поиграть немного. Код пусть будет на Go. Модели GPT-o1 и...
Forwarded from Go Update
🎉 Вышел Go 1.24! 🎉
Этот момент настал.
Ключевые нововведения:
— Дженерики теперь умеют в псевдонимы (aliases) т.е. теперь можно писать так
Поздравляю тех, кому приходилось работать с указателями в дженериках, теперь можно хоть нормальные сигнатуры наружу выставлять.
— Теперь можно отслеживать версии и использовать утилиты прямо с помощью команды
—
— Бинари запущенные с помощью
—
— С помощью новой переменной окружения
—
— Новая реализация map на основе Swiss Tables. Бигтехи ваши вопросы на собесах больше неактуальны 🤡.
— Инлайнинг стал мощнее. Теперь, с большей вероятностью, тело функции которую вы передаете как аргумент будет вставлено в место ее вызова. Делали в основном для итераторов которые уступали по скорости циклам. Вместе с прошлым изменением и прочими изменениями в рантайме дало совокупный буст в 3-5% по производительности.
— Различные улучшения CGO с помощью новых директив.
— Новый способ гонять бенчи
— С помощью переменной окружения
— Пакет со слабыми указателями стал доступен всем.
— Подъехала замена финалайзерам. С типобезопастностью и сигнатурой которая намекает как делать правильно (и длинной докой объясняющей все сценарии). А еще их можно повесить сколько угодно в отличии от финалайзеров. Почему это важно я писал ранее.
— Пакет testing/synctest который в будущем позволит нам полностью дропнуть все моки времени. Пока обещают изменения API поэтому скрыто за флагом
— Появился OpenRoot. TLDR: открыв каталог таким образом из него нельзя убежать используя симлинки и прочая. Штука интересная для тех у кого пути до файлов генерируются извне.
— Куча прочих улучшений, включая новый функции для итераторов в пакеты
— У тестов и бенчей появился свой контекст! Можно будет дропнуть кучу кода отвечающего за создание контекстов в тестах.
Полное описание (жирного) релиза вот тут.
Этот момент настал.
Ключевые нововведения:
— Дженерики теперь умеют в псевдонимы (aliases) т.е. теперь можно писать так
type MyType[T any] = myType[T,*T]
Поздравляю тех, кому приходилось работать с указателями в дженериках, теперь можно хоть нормальные сигнатуры наружу выставлять.
— Теперь можно отслеживать версии и использовать утилиты прямо с помощью команды
go tool
. Краткий смысл сего: оно помещает все зависимости добавляемой тулзы в require
блок, а саму утилиту в блок tool. Учтите, что если вы не указываете отдельный go.mod
файл с помощью флага -modfile
(его принимают большинство команд) то зависимости внешней тулзы перемешаются с вашими. Однако есть и хорошая новость — из-за умного механизма «вычистки» MVS если кто то импортирует ваш модуль, то зависимости которые нужны для утилит к нему не попадут.—
go test
теперь гоняет go vet
с небольшим числом анализаторов перед запуском тестов для поиска распространенных ошибок (в том числе ошибок в оформлении тестов). go vet
тоже подтянули, теперь, например, ругается на printf
функции где аргумент только строка.— Бинари запущенные с помощью
go run
и go tool
теперь кешируются внутри внутри билд кэша. Никаких больше пересборок на каждом go run
. —
go build
и go install
научили в json вывод.— С помощью новой переменной окружения
GOAUTH
можно определить принцип для авторизации на приватных серверах модулей. Подробности с помощью go help goauth
—
go build
теперь вставляет в бинарь информацию о версии (наконец-то можно перестать делать это вручную!) с использованием тега и/или хеша коммита вашего гита (или mercurial и прочая).— Новая реализация map на основе Swiss Tables. Бигтехи ваши вопросы на собесах больше неактуальны 🤡.
— Инлайнинг стал мощнее. Теперь, с большей вероятностью, тело функции которую вы передаете как аргумент будет вставлено в место ее вызова. Делали в основном для итераторов которые уступали по скорости циклам. Вместе с прошлым изменением и прочими изменениями в рантайме дало совокупный буст в 3-5% по производительности.
— Различные улучшения CGO с помощью новых директив.
— Новый способ гонять бенчи
for b.Loop() { ... }
. Основной плюс (кроме того, что меньше писать) в том, что гонялке бенчмарков больше не нужно вызывать вашу функцию несколько раз, ибо сама найдет нужные параметры во время цикла. А значит дорогие блоки инициализации и удаления по итогу бенча стали дешевле. — С помощью переменной окружения
GOCACHEPROG
можно настроить свое утилиту которое будет отвечать за кеширование, вместо стандартного «все на диск в папочку». Пригодиться тем, у кого распределенные билды или много чего собирается в докере. Документация.— Пакет со слабыми указателями стал доступен всем.
— Подъехала замена финалайзерам. С типобезопастностью и сигнатурой которая намекает как делать правильно (и длинной докой объясняющей все сценарии). А еще их можно повесить сколько угодно в отличии от финалайзеров. Почему это важно я писал ранее.
— Пакет testing/synctest который в будущем позволит нам полностью дропнуть все моки времени. Пока обещают изменения API поэтому скрыто за флагом
GOEXPERIMENT=synctest
— Появился OpenRoot. TLDR: открыв каталог таким образом из него нельзя убежать используя симлинки и прочая. Штука интересная для тех у кого пути до файлов генерируются извне.
— Куча прочих улучшений, включая новый функции для итераторов в пакеты
bytes
и strings
.— У тестов и бенчей появился свой контекст! Можно будет дропнуть кучу кода отвечающего за создание контекстов в тестах.
Полное описание (жирного) релиза вот тут.
go.dev
Go 1.23 Release Notes - The Go Programming Language
Forwarded from Cross Join - канал о разработке (Anton Okolelov)
Вышел Go 1.24 (интерактивные примеры тут)
Производительность
Снижение нагрузки на CPU на 2-3% благодаря:
- Новой реализации встроенных map на основе Swiss Tables
- Более эффективному выделению памяти для малых объектов
- Новой внутренней реализации mutex в runtime
Обобщенные псевдонимы типов
Теперь можно создавать параметризованные псевдонимы типов, например:
Слабые указатели
Добавлен новый пакет weak, который предоставляет weak pointers – указатели, которые не препятствуют сборке мусора. Это полезно для реализации кэшей и других структур данных, где нужно избежать утечек памяти.
Улучшенные финализаторы
Представлена новая функция runtime.AddCleanup, которая является более гибкой и эффективной альтернативой runtime.SetFinalizer. Она позволяет:
- Прикреплять несколько функций очистки к одному объекту
- Работать с внутренними указателями
- Избегать утечек памяти при циклических ссылках
Ограниченный доступ к файловой системе
Новый тип os.Root позволяет ограничить файловые операции определенной директорией, что полезно для безопасной работы с файлами.
Улучшения для тестирования
Добавлен метод testing.B.Loop, который предоставляет более простой и надежный способ написания бенчмарков:
Новый пакет testing/synctest позволяет тестировать код с временными операциями, используя синтетические часы вместо реального времени.
Криптография
Добавлены новые криптографические пакеты:
crypto/sha3 - реализация SHA-3
crypto/hkdf - реализация HKDF
crypto/pbkdf2 - реализация PBKDF2
Работа с JSON
Добавлена новая опция omitzero для тегов структур, которая позволяет пропускать нулевые значения при сериализации в JSON. В отличие от omitempty, она работает корректно с time.Time и другими типами, имеющими метод IsZero().
Инструментарий
Go модули теперь могут отслеживать зависимости от исполняемых файлов с помощью директив tool в go.mod. Команды go build, go install и go test получили флаг -json для вывода результатов в формате JSON.
@crossjoin
Производительность
Снижение нагрузки на CPU на 2-3% благодаря:
- Новой реализации встроенных map на основе Swiss Tables
- Более эффективному выделению памяти для малых объектов
- Новой внутренней реализации mutex в runtime
Обобщенные псевдонимы типов
Теперь можно создавать параметризованные псевдонимы типов, например:
type Set[T comparable] = map[T]bool
Слабые указатели
Добавлен новый пакет weak, который предоставляет weak pointers – указатели, которые не препятствуют сборке мусора. Это полезно для реализации кэшей и других структур данных, где нужно избежать утечек памяти.
Улучшенные финализаторы
Представлена новая функция runtime.AddCleanup, которая является более гибкой и эффективной альтернативой runtime.SetFinalizer. Она позволяет:
- Прикреплять несколько функций очистки к одному объекту
- Работать с внутренними указателями
- Избегать утечек памяти при циклических ссылках
Ограниченный доступ к файловой системе
Новый тип os.Root позволяет ограничить файловые операции определенной директорией, что полезно для безопасной работы с файлами.
// Пример использования os.Root
root, err := os.OpenRoot("/path/to/dir")
if err != nil {
log.Fatal(err)
}
// Операции ограничены директорией
f, err := root.Open("file.txt")
if err != nil {
log.Fatal(err)
}
Улучшения для тестирования
Добавлен метод testing.B.Loop, который предоставляет более простой и надежный способ написания бенчмарков:
func BenchmarkMyFunc(b *testing.B) {
// Вместо for i := 0; i < b.N; i++
for b.Loop() {
// код бенчмарка
}
}
Новый пакет testing/synctest позволяет тестировать код с временными операциями, используя синтетические часы вместо реального времени.
Криптография
Добавлены новые криптографические пакеты:
crypto/sha3 - реализация SHA-3
crypto/hkdf - реализация HKDF
crypto/pbkdf2 - реализация PBKDF2
Работа с JSON
Добавлена новая опция omitzero для тегов структур, которая позволяет пропускать нулевые значения при сериализации в JSON. В отличие от omitempty, она работает корректно с time.Time и другими типами, имеющими метод IsZero().
Инструментарий
Go модули теперь могут отслеживать зависимости от исполняемых файлов с помощью директив tool в go.mod. Команды go build, go install и go test получили флаг -json для вывода результатов в формате JSON.
@crossjoin
go.dev
Go 1.24 Release Notes - The Go Programming Language
Forwarded from Николай Тузов
https://github.com/JustSkiv/goschedviz
Пока я делал завершающую часть ролика про планировщик, решил немного поиграться с визуализацией его работы... В итоге, слишком сильно увлёкся и получилось это.
Что это?
Красивая
Важно: инструмент сделан исключительно в образовательных целях (а скорее даже — побаловаться на досуге). Не стоит использовать его в продакшене!
Что умеет:
- Мониторинг метрик планировщика в реальном времени
- Визуализация заполнения LRQ и GRQ
- Построение графиков LRQ и GRQ
- Работает с любой Go программой (в теории...)
Принцип работы максимально простой: запускаем целевую программу через schedtrace, парсим вывод и строим из него различные метрики, отрисовывая результат через termui.
Подробная документация, примеры использования и инструкция по установке есть в репозитории (есть и на русском).
Также там есть подробная инструкция по контрибьюту, если кто-то захочет поучаствовать в разработке. Это хороший учебный пример для новичков (но только после чтения инструкции!).
————
P.S. Третья часть ролика про планировщик всё ещё в работе. Там, кроме прочего, как раз будет живая демонстрация работы этого инструмента на разных примерах
#go_scheduler #repo
Please open Telegram to view this post
VIEW IN TELEGRAM
Lazygit - простой консольный UI для git-комманд, написанный на Go
https://github.com/jesseduffield/lazygit
Да-да, в очередной раз я признаюсь в любви утилитам с минималистичным консольным (графическим) интерфейсом.
Честно говоря, я не уверен насколько эта штука будет удобная в реальной жизни, но точно буду пробовать, хотя бы ради эстетического удовольствия.
Но вообще, при работе с гитом, мне нравится гибридный вариант - сложные действия выполняю в хорошем GUI интерфейсе, а более простые текстом в терминале (особенно удобно с плагином oh my zsh).
#repo #terminal_ui
https://github.com/jesseduffield/lazygit
Да-да, в очередной раз я признаюсь в любви утилитам с минималистичным консольным (графическим) интерфейсом.
Честно говоря, я не уверен насколько эта штука будет удобная в реальной жизни, но точно буду пробовать, хотя бы ради эстетического удовольствия.
Но вообще, при работе с гитом, мне нравится гибридный вариант - сложные действия выполняю в хорошем GUI интерфейсе, а более простые текстом в терминале (особенно удобно с плагином oh my zsh).
#repo #terminal_ui
GitHub
GitHub - jesseduffield/lazygit: simple terminal UI for git commands
simple terminal UI for git commands. Contribute to jesseduffield/lazygit development by creating an account on GitHub.
Тестирование конкурентного кода с помощью testing/synctest
https://go.dev/blog/synctest
Damien Neil из Go team рассказал про новый (экспериментальный) пакет testing/synctest для тестирования конкурентного кода, который доступе с версии Go 1.24
Экспериментальный — значит, он доступен только при
В чём суть:
Вместо ненадёжных sleep'ов и таймаутов для проверки асинхронных операций, пакет предлагает детерминированный подход. Весь тестируемый код выполняется в изолированном окружении - bubble. В этом окружении время виртуальное и продвигается только когда все горутины заблокированы. То есть, мы точно знаем, когда все горутины достигли точки блокировки с помощью Wait()
Никаких больше фейковых часов и моков time.Now() - всё работает из коробки.
При этом, у пакета всего два метода:
Пример до:
После:
#go_official #go_experimental
https://go.dev/blog/synctest
Damien Neil из Go team рассказал про новый (экспериментальный) пакет testing/synctest для тестирования конкурентного кода, который доступе с версии Go 1.24
Экспериментальный — значит, он доступен только при
GOEXPERIMENT=synctest
В чём суть:
Вместо ненадёжных sleep'ов и таймаутов для проверки асинхронных операций, пакет предлагает детерминированный подход. Весь тестируемый код выполняется в изолированном окружении - bubble. В этом окружении время виртуальное и продвигается только когда все горутины заблокированы. То есть, мы точно знаем, когда все горутины достигли точки блокировки с помощью Wait()
Никаких больше фейковых часов и моков time.Now() - всё работает из коробки.
При этом, у пакета всего два метода:
synctest.Run()
и synctest.Wait()
Пример до:
// Классический подход с time.Sleep
func TestAfterFunc(t *testing.T) {
calledCh := make(chan struct{})
context.AfterFunc(ctx, func() {
close(calledCh)
})
// Ждем и надеемся...
time.Sleep(10 * time.Millisecond)
if called {
t.Fatal("called too early")
}
}
После:
// С synctest - детерминированно и без слипов
func TestAfterFunc(t *testing.T) {
synctest.Run(func() {
funcCalled := false
context.AfterFunc(ctx, func() {
funcCalled = true
})
synctest.Wait()
if funcCalled {
t.Fatal("called too early")
}
})
}
#go_official #go_experimental
go.dev
Testing concurrent code with testing/synctest - The Go Programming Language
Go 1.24 contains an experimental package to aid in testing concurrent code.
Forwarded from Николай Тузов
https://youtu.be/kedW1xO3Zbo
В первой половине видео мы будем шаг за шагом строить планировщик Go идя от простого к сложному, детально вникая в суть каждого нового механизма — какую проблему он решает и каким образом. В итоге мы получим Планировщик, который очень близок к настоящему (исключая совсем уж тонкие механизмы, часть из котрых я разберу в отдельных эксклюзивных для моих платных каналов роликах, ссылки см. ниже).
Во второй половине мы будем препарировать настоящий планировщик Go, изучая как ведут себя все его основные параметры вживую на примерах разных программ. Я буду это делать с помощью своей утилиты goschedviz (ссылку см. ниже), которую написал специально для этого ролика.
И в самом конце построим общую схему планировщика, чтобы окинуть взгляд все механизмы, которые мы обсудили.
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Планировщик Go — самый подробный гайд простым языком
Самый подробный гайд по Планировщику Go максимально простым языком. В первой половине видео мы будем шаг за шагом строить планировщик Go идя от простого к сложному, детально вникая в суть каждого нового механизма — какую проблему он решает и каким образом.…
Как добавить цикл while в Go
https://habr.com/ru/articles/888992/
Неплохая статья для погружения в основы компиляции Go. Автор показывает, как добавить в язык новую конструкцию, а именно - цикл
Кстати, после прочтения статьи неплохим упражнением будет добавление ещё какой-нибудь своей конструкции, пусть даже самой абсурдной, лишь бы вам было весело✨
————
UPD: канал автора стать: @siliconchannel
Кстати, можете задать ему вопросы лично в комментариях к этому посту
#go_internal #go_compiler
https://habr.com/ru/articles/888992/
Неплохая статья для погружения в основы компиляции Go. Автор показывает, как добавить в язык новую конструкцию, а именно - цикл
while
. Разумеется, добавляется он не потому что он там нужен, а лишь как простой и наглядный пример.Кстати, после прочтения статьи неплохим упражнением будет добавление ещё какой-нибудь своей конструкции, пусть даже самой абсурдной, лишь бы вам было весело
————
UPD: канал автора стать: @siliconchannel
Кстати, можете задать ему вопросы лично в комментариях к этому посту
#go_internal #go_compiler
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Компилятор GO. Добавляем цикл WHILE
На одной из конференций я наблюдал, как наши коллеги реализовывали тернарный оператор в Go с помощью комментариев. Доклад длился всего минут 10, и, честно говоря, я не смог уловить ничего внятного,...
Forwarded from Николай Тузов
https://habr.com/ru/articles/891426/
Поверьте, эта статья — отдельный подвиг, на который я потратил огромное количество времени. Даже на то, чтобы в последний раз перечитать и навести финальные штрихи, ушло буквально пол дня.
Хотелось, чтобы всё получилось идеально — каждая формулировка, каждая картинка
А теперь ваша очередь — я очень надеюсь, что эта статья побьёт мой предыдущий рекорд по лайкам и просмотрам. У Хабра нет механизмов продвижения, кроме как рейтинг статьи, поэтому вы знаете как меня отблагодарить
Основная мотивация для написания такой статьи и публикация её в открытом доступе — она должна хорошо зайти на Хабре. Иначе усилия не будут оправданными.
————
Ну и да, можете считать эту статью пробой пера и демо-версией моей будущей книги. Можно сказать, это могла бы быть полноценная глава оттуда. Правда, в книге иллюстрации будут лучше прорабатываться иллюстратором.
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Планировщик Go — самый подробный гайд простым языком
Давайте спроектируем с нуля планировщик Go — начнём с самой простой и понятной наивной реализации, а затем шаг за шагом будем разбираться, какие изъяны в ней есть, и придумывать как их решать,...
Swiss Tables новая реализация map — Go 1.24
https://go.dev/blog/swisstable
Перевод
Как вы наверняка уже знаете, в Go 1.24 встроенная реализация map была полностью переработана и теперь основана на Swiss Table. В этой статье Michael Pratt (один из авторов языка) разобрал какие преимущества даёт новая реализация по сравнению с традиционными хеш‑таблицами.
#go_official
https://go.dev/blog/swisstable
Перевод
Как вы наверняка уже знаете, в Go 1.24 встроенная реализация map была полностью переработана и теперь основана на Swiss Table. В этой статье Michael Pratt (один из авторов языка) разобрал какие преимущества даёт новая реализация по сравнению с традиционными хеш‑таблицами.
#go_official
go.dev
Faster Go maps with Swiss Tables - The Go Programming Language
Go 1.24 improves map performance with a brand new map implementation