unique - новый пакет в стандартной библиотеке Go 1.23
https://go.dev/blog/unique
Ещё один интересный пост в официальном блоге авторов Go с подробным объяснением очередной интересной новинки в версии 1.23
Пакет unique упрощает работу с дубликатами. То есть, он позволяет выполнять дедупликацию таким хитрым образом, чтобы все ссылки указывали на единственную, уникальную копию. При этом пакет эффективно управляет этими копиями под капотом.
Возможно, вы уже встречали этот подход под названием Interning.
Автор статьи рассказывает и показывает, как это работает, и почему это полезно.
#go_official #go_1_23
https://go.dev/blog/unique
Ещё один интересный пост в официальном блоге авторов Go с подробным объяснением очередной интересной новинки в версии 1.23
Пакет unique упрощает работу с дубликатами. То есть, он позволяет выполнять дедупликацию таким хитрым образом, чтобы все ссылки указывали на единственную, уникальную копию. При этом пакет эффективно управляет этими копиями под капотом.
Возможно, вы уже встречали этот подход под названием Interning.
Автор статьи рассказывает и показывает, как это работает, и почему это полезно.
#go_official #go_1_23
go.dev
New unique package - The Go Programming Language
New package for interning in Go 1.23.
1 30👍9🤔1
What's in an (Alias) Name?
https://go.dev/blog/alias-names
В версии Go 1.24, которая запланирована на начало февраля 2025 года, появится возможность объявлять generic alias type (пока можете почитать proposal).
В этой статье авторы Go объясняют что это и зачем. Заодно тут есть небольшой ликбез по обычному alias type.
Как обычно, буду честен — на мой взгляд, эта фича вряд ли пригодится многим из вас. Автор статьи позиционирует её как средство для рефакторинга пакетов, в которых есть дженерики — а много у вас таких пакетов?🙃
Но, в любом случае, потратить 10-15 минут своего времени на ознакомление с новой фичей своего инструмента считаю полезным занятием. Тем более, когда сами авторы стараются и пишут для нас подобные разборы.
————
В комментариях было бы особенно интересно увидеть людей, которые эту фичу очень ждут. Расскажите, почему?
#go_official #go_1_23
https://go.dev/blog/alias-names
В версии Go 1.24, которая запланирована на начало февраля 2025 года, появится возможность объявлять generic alias type (пока можете почитать proposal).
В этой статье авторы Go объясняют что это и зачем. Заодно тут есть небольшой ликбез по обычному alias type.
Как обычно, буду честен — на мой взгляд, эта фича вряд ли пригодится многим из вас. Автор статьи позиционирует её как средство для рефакторинга пакетов, в которых есть дженерики — а много у вас таких пакетов?
Но, в любом случае, потратить 10-15 минут своего времени на ознакомление с новой фичей своего инструмента считаю полезным занятием. Тем более, когда сами авторы стараются и пишут для нас подобные разборы.
————
В комментариях было бы особенно интересно увидеть людей, которые эту фичу очень ждут. Расскажите, почему?
#go_official #go_1_23
Please open Telegram to view this post
VIEW IN TELEGRAM
go.dev
What's in an (Alias) Name? - The Go Programming Language
A description of generic alias types, a planned feature for Go 1.24
👍13❤7 2
Golang Дайджест
Range Over Function Types https://go.dev/blog/range-functions Подробный пост в официальном блоге разработчиков Go о том, зачем добавили итераторы в Go 1.23, что они из себя представляют, как их использовать, приводят примеры. #go_official #go_1_23
Ranging over functions in Go 1.23
https://eli.thegreenplace.net/2024/ranging-over-functions-in-go-123/
Ещё один неплохой пост про
#go_1_23
https://eli.thegreenplace.net/2024/ranging-over-functions-in-go-123/
Ещё один неплохой пост про
range
по функциям, который ввели в Go v1.23: что это и как пользоваться.#go_1_23
🔥9❤3🤯1
Развлекаемся с итераторами в Go
Перевод и оригинал
Очередной пост про итераторы в Go. Не воспринимайте его как руководство к действию, такого посыла там и нет. Скорее как повод порассуждать.
В чём суть. Автор недоволен громоздкими конструкциями по типу:
И хочет сделать как в JS:
Поэтому он реализовал методы: From (создание итератора), Collect (сбор в слайс), Each (обход), Reverse (разворот), Map (преобразование) и Filter.
Получается, конечно, красиво, но автор сам же признаёт:
А я напомню, что желание красоты, без учёта других потребностей, когда-то привело людей к CoffeeScript.
#iterators #go_1_23
Перевод и оригинал
Очередной пост про итераторы в Go. Не воспринимайте его как руководство к действию, такого посыла там и нет. Скорее как повод порассуждать.
В чём суть. Автор недоволен громоздкими конструкциями по типу:
// В пакете slices нет функций Map, Filter или ForEach
// Это просто пример
slices.ForEach(
slices.Filter(
slices.Map(
slices.Reverse(slices.All([]int{1,2,3,4})),
func(i int) int { return i * i},
),
func(i int) bool { return i % 2 == 0 }
),
func(i int) { fmt.Println(i) }
)
И хочет сделать как в JS:
From([]int{1,2,3,4}).
Reverse().
Map(func(i int) int { return i * i }).
Filter(func(i int) bool { return i%2 == 0 })
Поэтому он реализовал методы: From (создание итератора), Collect (сбор в слайс), Each (обход), Reverse (разворот), Map (преобразование) и Filter.
Получается, конечно, красиво, но автор сам же признаёт:
я понимаю почему команда Go реализовала итераторы по другому
А я напомню, что желание красоты, без учёта других потребностей, когда-то привело людей к CoffeeScript.
#iterators #go_1_23
Хабр
Развлекаемся с итераторами в Go
Релиз версии Go 1.23 добавил поддержку итераторов и пакет iter . Теперь можно перебирать константы, контейнеры ( map , slice , array , string ) и функции. Сначала создание итератора показалось...
👍8🤔3
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.
👍20🔥7❤3🤯1
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
🔥55👍31❤15
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
🔥47❤17👍5
Тестирование конкурентного кода с помощью 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.
👍20🔥19
Как добавить цикл 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, и, честно говоря, я не смог уловить ничего внятного,...
🔥22👍5🤔4❤2
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
🔥34👍10❤4
Forwarded from Go Update
🎉 Вышел Go 1.25! 🎉
Пока я не успел статью про новый сборщик мусора написать, поэтому быстро пробегусь по основным нововведениям которых не касался в прошлых записях.
— ♻️ Бинарей в комплекте теперь меньше. Разработчики компилятора активно использовать команду
— Новая директива
— Когда go команда обновляет
—
— 🍵 Новый экспериментальный сборщик мусора. О нем статья будет позже.
— 🔀️️️️️️ Новый тип
— 🛠 Компилятор теперь генерирует дебаг-инфу в формате DWARF5. Практический итог: бинари едят меньше места и быстрее комбинируются.
— 🏎️️️️️️ Новый экспериментальный пакет
— Тип
— 🏎️️️️️️ Функция
— Директива
—
— Новый метод
— 🔥
Читать про релиз вот тут.
Пока я не успел статью про новый сборщик мусора написать, поэтому быстро пробегусь по основным нововведениям которых не касался в прошлых записях.
— ♻️ Бинарей в комплекте теперь меньше. Разработчики компилятора активно использовать команду
go tool
у себя внутри, что убирает необходимость поставлять заготовки в комплекте. Но как минимум go build
и go test
бинари все еще на месте.— Новая директива
ignore
в go.mod. Подробное описание тут. Если в вкратце: для этого вы раньше использовали каталог testdata
и каталоги которые начинаются с точки.— Когда go команда обновляет
go
1.xx.y
директиву в go.mod
она больше не добавляет toolchain
директиву.—
go vet
теперь ругается на неправильное использование sync.WaitGroup.Add
и fmt.Sprintf("%s:%d", host, port)
ибо есть net.JoinHostPort
.— 🍵 Новый экспериментальный сборщик мусора. О нем статья будет позже.
— 🔀️️️️️️ Новый тип
runtime/trace.FlightRecorder
позволяет записывать только значимые события, а не всё подряд для tracing’га (под капотом используется циклический буфер, который помнит N последних секунд).— 🛠 Компилятор теперь генерирует дебаг-инфу в формате DWARF5. Практический итог: бинари едят меньше места и быстрее комбинируются.
— 🏎️️️️️️ Новый экспериментальный пакет
encoding/json/v2
. По хорошему про него тоже надо писать отдельную статью, но если в кратце — он намного быстрее того что было внутри encoding/json
. А другая хорошая новость заключается в том, что если вы включили GOEXPERIMENT=jsonv2
то больше ничего менять не надо, так как encoding/json
сам подключит новую внутряку.— Тип
os.Root
приобрел несколько новых методов.— 🏎️️️️️️ Функция
reflect.TypeAssert
позволяет приводить типы из reflect.Value в конкретный тип, минуя потенциально аллоцирующий вызов reflect.Value.Interface
.— Директива
GODEBUG=checkfinalizers=1
позволяет понять, как дела в вашей очереди cleanup’ов и finalizer’ов во время каждого GC.—
SetDefaultGOMAXPROCS
позволяет сбросить настройки GOMAXPROCS
если вдруг переменная прилетела через Env или через прошлый вызов GOMAXPROCS
.— Новый метод
sync.WaitGroup.Go
- больше нет необходимости тащить errgroup
если вам не нужен был возврат ошибок и отмена контекста.— 🔥
testing.T/B/F
теперь имеют метод Output() io.Writer
который позволяет правильно редиректить вывод внутри вызова теста.Читать про релиз вот тут.
go.dev
Go Modules Reference - The Go Programming Language
1🔥40👍21❤9🤯3