Библиотека Go-разработчика | Golang
23.3K subscribers
2.08K photos
42 videos
87 files
4.45K links
Все самое полезное для Go-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/32d20779

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
⚒️ Ants — библиотека, которая реализует высокопроизводительный пул горутин с фиксированной емкостью.

📌 Под капотом:

☑️ Автоматическое управление большим числом горутин
☑️ Периодическое удаление просроченных горутин
☑️ Расширенный API, включающий отправку задач, получение количества запущенных горутин, динамическую настройку емкости пула, освобождение и перезапуск пула
☑️ Обработка паник для предотвращения сбоев программ
☑️ Эффективное использование памяти
☑️ Неблокирующий механизм https://google.github.io/styleguide/go/index
🔥14🥱311👍1
Дженерики, добавленные в Go 1.18, стали самым большим нововведением с момента первого опенсорсного выпуска Go. На дворе почти 2024 год и Go 1.21.4.

💬 Расскажите, вы используете дженерики в проде? Как впечатления?

#холивар
🥱127👍1
💡 Основная идея корутин — дать возможность выполнять что-то конкуретно, но не параллельно, а с блокированием и по запросу.

Расс Кокс писал о том, зачем нам нужен пакет coroutine для Go и как он будет выглядеть. А на Хабре недавно появился перевод его заметок👇

🔗 Читать
🤔6👍21🔥1
🤔 Кровать на заднем плане, человек, который ходит туда-обратно, и песня «Мой кот боится темноты». И всё это в первые две минуты. Как думаете, что это?

А это запись четырехчасового стрима для Go-разработчиков, на котором Vany Serezhkin пишет VPN на веб-сокетах 🤷‍♂️

😉 А вы думали, чем же заняться вечером в пятницу.
👍111
👨‍🏫Полезные каналы по Go

Напоминаем, что «Библиотека программиста» запустила два канала специально для Go-разработчиков и тех, кто хочет ими стать.

Подписывайтесь:
👉Библиотека собеса по Go — тут мы готовимся к интервью
👉Библиотека задач по Go — тут решаем задачи, проходим тесты и изучаем код
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
🎥 Дорожная карта по параллельному программированию: подробный план изучения от Владимира Балуна

📌 Что внутри:

00:34 — Основы исполнения кода
01:09 — Основы операционных систем
02:01 — Параллельное и конкурентное исполнение кода
02:42 — Примитивы синхронизации
03:45 — Основы архитектуры компьютера
04:06 — Атомики
04:51 — Проблемы параллельного программирования
05:23 — Продвинутые примитивы синхронизации
06:02 — Паттерны параллельного программирования
06:46 — Ввод-вывод
07:15 — Барьеры памяти
08:03 — Продвинутая архитектура компьютера
08:57 — Алгоритмы синхронизации
09:56 — Lock-free структуры данных
10:30 — Wait-free структуры данных
10:45 — Как изучать параллельное программирование
👍29🥱12
📊 Go Logging Benchmarks

Сравнение производительности популярных Go-библиотек логирования, включая пакет стандартной библиотеки slog.
🔥17👍3
River — надежная высокопроизводительная система обработки заданий для Go и Postgres, использующая преимущества дженериков.

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

💡 River Client предоставляет интерфейс для добавления заданий и управления сервисами обработки и обслуживания заданий. Клиент создается с пулом базы данных, драйвером и структурой конфигурации, содержащей пакет Workers и другие настройки:

riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
Queues: map[string]river.QueueConfig{
river.DefaultQueue: {MaxWorkers: 100},
},
Workers: workers,
})

if err != nil {
panic(err)
}

// Run the client inline. All executed jobs will inherit from ctx:
if err := riverClient.Start(ctx); err != nil {
panic(err)
}
👍101🔥1
💡 Как можно тривиально реализовать типы sum/option на чистом Go, без использования сторонних пакетов или других хаков?

◆ Например, вы захотели, чтобы функция возвращала либо data value, либо error. Вот как это может выглядеть псевдокодом:

func f() Option {
result, err := DoSomething()
if err != nil {
return Error("oops:", err)
}
return Data(result)
}


◆ Тип Option объединяет два варианта: Data и Error. Если все идет хорошо, функция возвращает Data, в противном случае — Error.

📌 Возможно ли это в Go?

◆ Да, но для этого нужно немного изменить концепцию интерфейсов. Интерфейсы описывают общее поведение, перечисляя одну или несколько функций. Каждый тип, который реализует эти функции, является экземпляром этого интерфейса.

◆ Однако тип sum не обязательно имеет какие-либо функции для реализации. Ему нужно только представлять разные виды значений. Поэтому нам придется использовать пустой интерфейс. Но это тоже не сработает: любой тип удовлетворяет пустому интерфейсу.

◆ Взгляните на этот интерфейс:

type Option interface {
isOption()
}


◆ Функция isOption() служит только для того, чтобы сделать этот интерфейс отличным от пустого интерфейса. Только типы, реализующие isOption, являются вариантами Option.

◆ И обратите внимание, что isOption() не экспортируется. Это предотвращает добавление вариантов к типу Option сторонним кодом. Другими словами, эта функция «‎запечатывает» интерфейс Option.

◆ Два варианта, Data и Error, следовательно, реализуются следующим образом:

type Data[T any] struct {
Value T
}
func (Data[T]) isOption() {}

type Error struct {
Err error
}
func (Error) isOption() {}


◆ Вот и все! Наш тип Option готов к использованию. Вот функция, которая возвращает тип Option вместо известной пары (value, error):

func DoSomething(b bool) Option {
if b {
return Data[int]{Value: 42}
}
return Error{
Err: fmt.Errorf("oops"),
}
}


◆ Опытные разработчики могут сказать, что возвращать интерфейс считается плохим стилем! И на это есть причина: если вызывающий получает обратно интерфейс, ему придется анализировать возвращаемое значение, чтобы определить конкретный тип за интерфейсом.

◆ Однако этот анализ возвращаемого значения является намеренной частью подхода типа sum в Go. Разные варианты типа sum требуют разных действий, поэтому естественной частью обработки типа sum является ветвление в обработке возвращаемого типа, специфичного для варианта.

◆ Не волнуйтесь, определение варианта и действия на его основе требуют только переключения по типу возвращаемого значения и отдельного case для каждого из возможных вариантов, вот так:

func main() {
opt := DoSomething(true)
switch option := opt.(type) {
case Data[int]:
fmt.Println(option.Value)
case Error:
fmt.Println(option.Err)
}
default:
}
}


◆ Но будьте осторожны: где бы вы ни писали такой переключатель типа sum, вы должны включить все варианты как case.

◆ К счастью, для этого есть линтер go-check-sumtype:

//sumtype:decl
type Option interface {
isOption()
}


#tip
🔥116🥱6👍3😁2
🕹💻 Разработка игр на Go для абсолютных новичков

🤔 Чем занимаются разрабы в свободное время, если их изматывают текущие задачи? Они отдыхают пишут ради удовольствия!

🤩 Miłosz Smółka, кофаундер Three Dot Labs и создатель Watermill, знакомит с фундаментальной игровой механикой 2D-аркады — от простого цикла рисования рамок до управления игровыми объектами, игроками и таймингами. В конце туториала вы узнаете, как написать игру Asteroids с помощью Go, Ebitengine и Donburi.
🔥18👍3
DI и IoC в Go: что это, как работают и почему полезны

В качестве примера автор использует клиент REST API для инструмента мониторинга веб-приложений Monibot.

👉 Читать
🔥122🌚1
Добавление тестов в шаблоны проектов: гайд для Go-разработчика

Недавно автор разбирался с шаблонами проектов Go и тем, как вы можете использовать некоторые из них для быстрого начала работы с Go-проектом (пример шаблона для простого CLI на Go). Данным шаблонам не хватало только тестов👇

🔗 Читать
🔥8👍2🥱1
❗️Мы запускаем серию исследований — и вы можете нам в этом помочь!

«Библиотека программиста» выпустит несколько статей, в которых мы проведем полноценные исследования.

Помогите нам выбрать интересные темы: может быть, вы давно хотели узнать, как изменилась зарплата у тех, кто релоцировался? Или гадаете, сколько лет нужно, чтобы стать миддлом?

Присылайте интересующие вас темы в комментарии — интересные мы возьмем в работу и поделимся с вами результатами 💙
👍2🔥21
🤔 Python — лёгкий. Go — простой. Простой != легкий

Статья, посвященная симбиозу, который Preslav Rachev и его команда нашли при использования Python и Go.

Не менее интересно читать обсуждение на Hacker News. Присоединяйтесь!
🔥9🥱4
🧰 Как (и почему!) разные типы параметров функций ведут себя по-разному: демистификация параметров функций в Go от Alex Edwards

Если вы новичок в Go, у вас могут возникать вопросы вроде этих: «Почему функции обычно изменяют мапы и срезы, но не другие типы данных?», «Почему мой срез не изменяется, когда я добавляю к нему элементы в функции?», «Почему присваивание нового значения параметру-указателю не оказывает никакого эффекта за пределами функции?».

Цель руководства — дать понятные ответы на эти и другие вопросы и на простых примерах объяснить не самые очевидные аспекты Go.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🥱21🔥1
👁Помогите «Библиотеке программиста» лучше узнать свою аудиторию

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

Пожалуйста, ответьте на несколько вопросов — это поможет нам делать более полезные и интересные посты!

Первая часть опроса 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2