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

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

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

Обратная связь: @justskiv
Download Telegram
#статья #diy #english

Делаем load balancer на Go (Implement a load balancer in Golang)

Как обычно, хороший способ понять, как что-то работает - попробовать сделать это своими руками.
Статья начинается с небольшого ликбеза по балансировщикам, и далее показан пример реализации с подробными пояснениями.

https://dev.to/bmf_san/implement-a-load-balancer-in-golang-8gj
5
Рассуждения про "Guard" Proposal для обработки ошибок в Go

https://wagslane.dev/posts/guard-keyword-error-handling-golang/

Обработка ошибок в Go достаточно многословна, но при этом надёжна - нам, как минимум, нужно писать для каждой ошибки:
if err != nil {
return err
}
Но зато мы точно ни одну не потеряем.

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

Несколько лет назад был предложен вот такой proposal. Суть его в том, чтобы добавить в Go два ключевых слова: must и guard.

- must - синтаксический сахар для паники при ненулевой ошибке
- guard - синтаксический сахар для return err при ненулевой ошибке

Автор статьи комментирует данный proposal, рассказывает что ему не нравится, и как сделать лучше.

В нашем чате предлагаю подискутировать на тему обработки ошибок - согласны ли с автором? Какие варианты нравятся вам больше? Или лучше оставить всё как есть?

#article #english #error_handling
🤔9👍3👎3🔥1
Признаки злоупотребления интерфейсами (Interface Pollution)

https://www.ardanlabs.com/blog/2016/10/avoid-interface-pollution.html

Автор рассуждает на тему злоупотребления интерфейсами, приводя конкретный пример кода и комментируя его.

Основная суть статьи заключается в этом кратком списке признаков (smell list) нежелательного использования интерфейсов:

- Пакет объявляет интерфейс, который полостью соответствует API своего собственного типа
- Фабричная функция возвращает значение интерфейса с неэкспортируемым конкретным значением внутри
- Интерфейс может быть удален и ничего не изменится для пользователя API
- Интерфейс не обеспечивает независимость кода от изменений реализации

Как обычно, интересно узнать ваше мнение в комментариях. Согласны с автором?

#english #interfaces #ardanlabs #cleancode
👍6🤔3🔥1
Options vs Builder Pattern

https://medium.com/@MTrax/golang-options-vs-builder-pattern-4123bfcc3c5c

Автор статьи рассматривает два паттерна для создания сложных объектов с опциональными параметрами - Options Pattern и Builder Pattern, их преимущества, недостатки и примеры реализации.

Options Pattern

Пример использования:

pizza := NewPizza(
WithDough("Regular"),
WithSauce("Tomato"),
WithCheese("Mozzarella"),
WithToppings([]string{"Pepperoni", "Olives", "Mushrooms"}),
)

Плюсы:
- Легкость использования
- Читаемость кода
- Более краткий и компактный код

Минусы:
- Может стать громоздким в использовании
- Меньше гибкость

Builder Pattern

Пример использования:

builder := NewConcretePizzaBuilder()
director := NewDirector(builder)
pizza := director.Construct()

Метод Construct:

func (d *Director) Construct() *Pizza {
return d.builder.
SetDough("Thin Crust").
SetSauce("Tomato").
SetCheese("Mozzarella").
SetToppings([]string{"Mushrooms", "Olives", "Onions"}).
Build()
}

Плюсы:
- Четкое разделение конструкции объекта от его представления
- Гибкость: позволяет создавать разные представления объекта с одним процессом конструкции
- Легко добавлять новые параметры

Минусы:
- Более более сложная и многословная реализация
- Больше абстракций
- Может быть избыточным
————

Как обычно, выбор между Options и Builder зависит от специфических потребностей вашего проекта

#golang #patterns #english
🔥13👍10
Defer your mutex Unlocks

https://www.ribice.ba/defer-mutex-unlocks/

Очень короткая статейка минут на 5 о том, почему нужно вызывать mutex.Unlock() именно в defer

У автора случилась классическая история: у них была функция, окруженная Mutex Lock / Unlock. Она не должна была паниковать, но внезапно делала это. Поэтому до Unlock дело не доходило и мьютекст оставался залоченным.

Наглядней всего проблему демонстрирует код:

defer func() {
if err := recover(); err != nil {
fmt.Println("Recovered") // mutex.Unlock() missed!
}
}()
mutex.Lock()
functionCallThatPanics()
mutex.Unlock()

После фикса:

defer func() {
if err := recover(); err != nil {
fmt.Println("Recovered")
}
}()
m.Lock()
defer m.Unlock() // will be called even after panic
functionCallThatPanics()

————

От себя добавлю: в большинстве случаев лучше использовать Unlock именно в defer. Да, это создает некоторый оверхед по производительности, зато спасает от описанных выше фэйлов. Если у вас нет необходимости тонкой оптимизации, то лучше не рисковать.

Кроме того, это довольно простой случай, а чаще бывает сложнее - когда между Lock / Unlock происходит несколько вызовов, и часть из них могут вернуть ошибку. В таком случае в 99.9% случаев нужно использовать именно defer, иначе вероятность багов многократно вырастает.

#article #english #mutex
👍292
GPT бот для работы с документацией Go

https://eli.thegreenplace.net/2023/retrieval-augmented-generation-in-go/

Как быть, если вы хотите спросить у GPT бота что-то по свежей документации Go, но его базы сильно устарели?

- You: what is the latest released version of the Go programming language?
- ChatGPT: As of my last update in April 2023, the latest stable version of Go
was 1.20.
- You: ...👌


Проблему можно решить с помощью Retrieval Augmented Generation (RAG), и Eli Bendersky в этой статье рассказывает как это делается. Ну и вкратце рассказывает, что такое RAG.

Если интересен только код, вот репозиторий этого проекта.

Пример ответа бота про вопрос о GOTOOLCHAIN (переменная окружения, которая появилась в Go 1.21):

In Go, `GOTOOLCHAIN` is an environment variable that determines which Go
toolchain version should be used. The value of `GOTOOLCHAIN` can be set to
various options:

1. `local`: This indicates that the bundled Go toolchain should be used.
2. `<name>`: This specifies a specific Go toolchain version that should
be used. If a binary with that name is found in the system PATH, it will be
used; otherwise, the `go` command will download and use the specified Go
toolchain.
3. `<name>+auto` or `<name>+path`: This tells the `go` command to
select and run a newer Go version as needed. It will consult the
`toolchain` and `go` lines in the current workspace's `go.work` file (or
the main module's `go.mod` file if there is no workspace) to determine
which toolchain version to use. If a newer version is specified in those
files, it will be used; otherwise, it will fallback to the default Go
toolchain.

Overall, `GOTOOLCHAIN` is used to specify the specific Go toolchain version or
the selection process of a newer Go version that should be used by the `go`
command.


#GPT #article #english
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥3
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
Самый.. детальный гайд по планировщику

https://nghiant3223.github.io/2025/04/15/go-scheduler.html

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

К тому же, статья довольно свежая: Apr 15, 2025

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

#article #english
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥56👍124🤔1