Golang Дайджест
7.87K subscribers
36 photos
1 file
165 links
Самое интересное из мира Go: новости, статьи, проекты, сервисы, изменения в языке и др.

Посты публикуются не часто - только самое важное, с чем я лично ознакомился.

Поэтому можно не мьютить канал =)

Обратная связь: @justskiv
Download Telegram
Паттерн Functional Options

Это очень популярный подход, который я встречал во всех компаниях, в которых довелось писать код на Go.

В этом посте я подробно описал суть проблемы, которую он решает. А в этом разобрал суть паттерна и его реализацию.

#pattern #guide
924🔥103👍2
unique - новый пакет в стандартной библиотеке Go 1.23

https://go.dev/blog/unique

Ещё один интересный пост в официальном блоге авторов Go с подробным объяснением очередной интересной новинки в версии 1.23

Пакет unique упрощает работу с дубликатами. То есть, он позволяет выполнять дедупликацию таким хитрым образом, чтобы все ссылки указывали на единственную, уникальную копию. При этом пакет эффективно управляет этими копиями под капотом.

Возможно, вы уже встречали этот подход под названием Interning.

Автор статьи рассказывает и показывает, как это работает, и почему это полезно.

#go_official #go_1_23
130👍9🤔1
Go memory ballast: How I learnt to stop worrying and love the heap

https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap/

Очень крутая статья, в которой разработчики Twitch снова борются с Garbage Collector'ом (GC). В статье есть очень крутой ликбез по GC, про некоторые его основы и нюансы.

И всё это закрепляется крутым реальным примером оптимизации, которую можно осознать благодаря понимаю этих самых тонкостей.

Будем честны, далеко не всем это пригодится в реальной работе, т.к. реальная польза будет заметна лишь при большом хайлоаде, но расширять кругозор полезно (а не расширять вредно).
Кроме того, статья поможет разобраться не столько в хайлоаде, сколько во внутреннем устройстве GC, а то ещё более ценно.

Статья написана очень круто — материал довольно сложный, глубокий, но при этом читается довольно легко и интересно.

————

Краткая суть проблемы из статьи: периодически Твич ловит внезапный рост нагрузки. Например, из-за так называемого refresh storm — это когда крупный стример перезапускает стрим, и все его зрители начинают массово обновлять страницу.

Масштабировать такое сложно, т.к. всё происходит слишком быстро, а держать достаточное количество мощностей, работающих постоянно — дорого.

Ребята решили оптимизировать нагрузку на процессор тем, что снизили частоту срабатывания GC. Как именно? Если кратко, то вот так:

func main() {

// Create a large heap allocation of 10 GiB
ballast := make([]byte, 10<<30)

// Application execution continues
// ...
}


Подробное обоснование, объяснение и результаты найдёте в статье 🙃

Ну ладно, спойлер, вот результаты: снижение количества срабатываний GC на 99% и снижение нагрузки на CPU на 30%

Вообще, всё это выглядит как грязный хак и костыли, но авторы уже завели proposal, в котором предлагают ввести флаг, позволяющий решить данную проблему легально.

#article #english #highload #garbage_collector
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍29🤯17🔥1110
Мысли про найм Go-разработчиков в 2024 году

https://habr.com/ru/articles/846962/

Честно, статья мне не очень понравилась, слишком сумбурно и очень много субъективных мыслей. И главное — не очень понятна основная мыль, которую пытался донести автор.

Но почитать все равно было интересно, ведь на собеседованиях я сейчас бываю довольно редко, и стало интересно что там сейчас происходит на рынке (спойлер — ровно то же самое, что и лет 5 назад).

В любом случае, автору статьи спасибо за то, что поделился своими мыслями ❤️

А вот дискуссии в комментариях читать оказалось даже интересней, чем саму статью.

————

С удивлением обнаружил, что автор этой статьи также является автором довольно неплохого сайта-тренажера для решения задач по программированию - Code Abbey. Да, на первый взгляд он выглядит неказисто, но задачки довольно неплохие, и подход интересный. Со мной им когда-то давно поделился Глеб Яльчик — на его взгляд, это один из лучших тренажеров для новичков. Не буду тут подробно объяснять почему — если интересно, спросите в комментариях, обсудим.

Расскажите также в комментариях про свой опыт собеседований по Go в последнее время, только не забывайте уточнять грейд.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍234
Golang Дайджест
почему
Продублирую здесь ответ Глеба из комментов, думаю многим будет интересно:

Потому что стандартные литкод и кодварс предлагают решать какой-то фрагмент кода. То есть они учат писать алгоритмы, но мешают писать код. Если мы говорим не про изучение алгоритмов, а про обучению программированию, то гораздо лучше подход CodeAbbey, который никак не навязывает способ решения задачи. Он говорит:

- вот описание проблемы
- вот вам тестовые данные, чтобы проверить правильно ли вы решили проблему
- далее только говорит верно или неверно

В результате, ученик решает задачу целиком, начиная с создания каталога с проектом и написания строчки package main, и заканчивая самостоятельным запуском кода. Более того, так как у ученика сохраняются все файлы локально, он довольно быстро приходит к мысли о том, что вот уже десятый раз он зачем-то пишет одни и те же функции, типа прочитать в слайс N целых чисел, данных в формате
N
V1 V2 V3 V4 ...

или еще что-то типовое. Что порождает неудержимое желание сделать свои библиотеки, для работы с данными из CodeAbbey.

Поэтому, если мы говорим про инструмент, для изучения программирования или языка, то CodeAbbey, при всей своей убогости по фичам, с моей точки зрения, находится вне конкуренции. Если же хочется задрачивать алгоритмы, то надо идти на leetcode
👍42🔥5
Golang Дайджест
Анонимная сеть в 200 строк кода на Go https://habr.com/ru/articles/745256/ Отличный пост для тех, кто хочет немного погрузиться в понятие анонимных сетей и не тратить на это много времени. Всё как мы любим: краткий и интересный ликбез по теме, затем практика…
Анонимная сеть в 100 строк кода на Go

https://habr.com/ru/articles/849552/

Хорошее продолжение хорошей статьи. Суть новой статьи автор сам неплохо подытожил в самом начале:

Прошло уже более года с тех пор как я написал статью - Анонимная сеть в 200 строк кода на Go. Пересмотрев её однажды осенним вечером я понял насколько всё в ней было ужасно - начиная с самого поведения логики кода и заканчивая его избыточностью. Сев за ноутбук и потратив от силы 20 минут у меня получилось написать сеть всего в 100 строк кода, используя лишь и только стандартную библиотеку языка.

Мне понравилось ❤️

#article #dyi #сети
Please open Telegram to view this post
VIEW IN TELEGRAM
21👍11🔥5
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1372
Codebase Refactoring (with help from Go)

https://go.dev/talks/2016/refactor.article

Читая предыдущую статью, наткнулся на очень интересную работу Расса Кокса про рефакторинг кода на Go. Странно, что я не видел её раньше, большое упущение 😩

Статья хорошая, полезная. Вообще, её стоило бы прочитать перед рассказом про алиасы.

#рефакторинг #russ_cox
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍14🔥32
Корутины: stackful vs stackless

https://habr.com/ru/articles/850970/

Статья не совсем по Go, она более общая (хотя, Go там тоже упоминается). Но тем лучше — чтобы лучше понимать, как что-то устроено в твоём языке, очень полезно поглядеть, как это сделано у соседей и сравнить.

Статья довольно короткая и написано очень хорошо, понятно, как я люблю.

#article
🔥1915👍4
Функциональные опции в Go

https://habr.com/ru/articles/842594/

🤓 Я как-то писал в своём основном канале про паттерн Functional Options — этот подход мне нравится, и я часто его вижу. А если он вам даже и не нравится, то познакомится всё равно стоит, т.к. встречать вы его наверняка тоже будете часто.

Если же хочется погрузиться глубже, то вот вам свежая подробная статья на Хабре на эту тему (не моя!). Написано очень хорошо, мне понравилось — читается легко и приятно.

————

Предвосхищая ваши комментарии, про Configurable Object я тоже писал 🤓

#article
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥7
Golang Дайджест
Функциональные опции в Go https://habr.com/ru/articles/842594/ 🤓 Я как-то писал в своём основном канале про паттерн Functional Options — этот подход мне нравится, и я часто его вижу. А если он вам даже и не нравится, то познакомится всё равно стоит, т.к.…
Паттерны многопоточности в Go

https://habr.com/ru/articles/852556/

Ещё одна хорошая статья от того же автора. Хорошая тема — одно дело понимать, как работают горутины, другое — уметь ими правильно пользоваться в разных ситуациях. Благо, за нас уже придумали хорошие решения различных типовых задач и оформили это в виде паттернов. И эта статья — очень неплохой способ с ними познакомиться.

————
UPD: автор статьи здесь также присутствует, можете обращаться к нему в комментариях к этому посту:

Если есть еще какие-то паттерны о которых я забыл, напишите. Дополню статью


#article
👍31🔥165
GO Scheduler: теперь не кооперативный?

https://habr.com/ru/articles/502506/

Да, это довольно старая статья, которая описывает изменения в работе планировщика Go в версии 1.14, которые касались вытеснения горутин.

Статья довольно сложная, но полезная. Поможет лучше осознать, что же там такого интересно произошло в 1.14

Если очень кратко:

Раньше горутину могла прервать только она сама, снаружи можно было лишь поставить флаг о желании её прервать, но проверяла его она сама. Из-за довольно легко можно было написать код, из-за которого горутина никогда не будет вытеснена, а это может привести к дедлоку программы.

В версии же 1.14 появился механизм, который позволяет прерывать такие вот жадные горутины с помощью сигнала SIGURG. Теперь если горутина работает более 10мс, планировщик может легко её прервать.

————

Но в статье это разобрано НАМНОГО подробней, мягко говоря. Настолько хорошего разбора я пока нигде не встречал.
👍28🔥1165
Погружение в интерфейсы Go

https://habr.com/ru/articles/856272/

Отличная комплексная статья по интерфейсам. Автор прошелся практически по всем аспектам, которые касаются темы:

- Что такое интерфейс
- Какая у него внутренняя структура
- Какие связанные вопросы могут задать на собеседованиях
- Пустой интерфейс
- Type Assertion
- Встраивание интерфейсов
- Где лучше размещать интерфейсы ❤️
И другое

Читается при этом интересно, приятно. Очень крутая работа, рекомендую
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥207👍3
GoLang исполнилось 15 лет 🍾

https://go.dev/blog/15years

А в этом посте авторы рассказывают, как он похорошел за последние 5 лет.
Please open Telegram to view this post
VIEW IN TELEGRAM
48👍15🔥11🤯1
Golang Conf 2024

Наверняка многие и так знают, но на всякий случай напоминаю — скоро будет HighLoad++ и в рамках него также Golang Conf 2024.

Когда: 2 и 3 декабря

Я смотрю HL++ практически всегда, без пропусков. И особенно люблю, когда в рамках него проводится ещё и крутая конференция по Go — ещё больше интересных докладов, и не надо их искать среди всех других.
А в этот раз у GoLang Conf будет целых два зала и отдельная секция Хардкор (ассемблер, внутренности, декомпиляция и т.п. Этой секции я особенно рад)
Также будут обсуждаться нововведения в Go v1.23.

Из особенно примечательного лично для меня:

- Секреты высокой производительности в многоядерных системах, Никита Галушко
- Конкурентность в Go: от железа к коду, Максим Горозий
- Ну и, конечно, на котиков Олега посмотрю обязательно

Программу, расписание и онлайн-билеты можно найти на сайте.

#партнерский_пост, но рекомендация честная
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143
Forwarded from Go Update
🔥 weak: new package providing weak pointers 🔥

Соскучались по интересным изменениям? Их есть у меня!

Начиная с 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 кеши элементарно на мапах. Как именно? А вот это я покажу в сообщении о следующем за этим изменении.
🔥24🤔154🤯3
Как писать качественные unit-тесты

https://habr.com/ru/articles/854546/

Немного про unit-тесты и как их прокачать: что такое мутационные тесты и зачем они нужны, что такое стабы и моки, в чем опасность использования моков и др.

Если вы уже умеете писать unit-тесты, но дальнейшие шаги пока не делали, статья вам будет полезна.
🔥19
Развлекаемся с итераторами в Go

Перевод и оригинал

Очередной пост про итераторы в 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
👍8🤔3