⚒️ Ants — библиотека, которая реализует высокопроизводительный пул горутин с фиксированной емкостью.
📌 Под капотом:
☑️ Автоматическое управление большим числом горутин
☑️ Периодическое удаление просроченных горутин
☑️ Расширенный API, включающий отправку задач, получение количества запущенных горутин, динамическую настройку емкости пула, освобождение и перезапуск пула
☑️ Обработка паник для предотвращения сбоев программ
☑️ Эффективное использование памяти
☑️ Неблокирующий механизм https://google.github.io/styleguide/go/index
📌 Под капотом:
☑️ Автоматическое управление большим числом горутин
☑️ Периодическое удаление просроченных горутин
☑️ Расширенный API, включающий отправку задач, получение количества запущенных горутин, динамическую настройку емкости пула, освобождение и перезапуск пула
☑️ Обработка паник для предотвращения сбоев программ
☑️ Эффективное использование памяти
☑️ Неблокирующий механизм https://google.github.io/styleguide/go/index
🔥14🥱3❤1⚡1👍1
Дженерики, добавленные в Go 1.18, стали самым большим нововведением с момента первого опенсорсного выпуска Go. На дворе почти 2024 год и Go 1.21.4.
💬 Расскажите, вы используете дженерики в проде? Как впечатления?
#холивар
💬 Расскажите, вы используете дженерики в проде? Как впечатления?
#холивар
🥱12❤7👍1
💡 Основная идея корутин — дать возможность выполнять что-то конкуретно, но не параллельно, а с блокированием и по запросу.
Расс Кокс писал о том, зачем нам нужен пакет coroutine для Go и как он будет выглядеть. А на Хабре недавно появился перевод его заметок👇
🔗 Читать
Расс Кокс писал о том, зачем нам нужен пакет coroutine для Go и как он будет выглядеть. А на Хабре недавно появился перевод его заметок👇
🔗 Читать
Хабр
Корутины для Go
Эта заметка о том, зачем нам нужен пакет coroutine для Go и как он будет выглядеть. Но прежде всего, что такое корутины? Сегодня каждый программист знаком с вызовами функций (подпрограмм): F вызывает...
🤔6👍2❤1🔥1
🤔 Кровать на заднем плане, человек, который ходит туда-обратно, и песня «Мой кот боится темноты». И всё это в первые две минуты. Как думаете, что это?
А это запись четырехчасового стрима для Go-разработчиков, на котором Vany Serezhkin пишет VPN на веб-сокетах 🤷♂️
😉 А вы думали, чем же заняться вечером в пятницу.
А это запись четырехчасового стрима для Go-разработчиков, на котором Vany Serezhkin пишет VPN на веб-сокетах 🤷♂️
😉 А вы думали, чем же заняться вечером в пятницу.
👍11❤1
Напоминаем, что «Библиотека программиста» запустила два канала специально для 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 — Как изучать параллельное программирование
📌 Что внутри:
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-библиотек логирования, включая пакет стандартной библиотеки
Сравнение производительности популярных Go-библиотек логирования, включая пакет стандартной библиотеки
slog
.🔥17👍3
⚒ River — надежная высокопроизводительная система обработки заданий для Go и Postgres, использующая преимущества дженериков.
🤩 River использует одну и ту же базы данных для данных приложения и очереди заданий. Помещая задания в очередь транзакций вместе с другими изменениями в базе данных, можно избежать целых классов проблем распределенных систем. Преимущества River отлично описаны в статье.
💡 River Client предоставляет интерфейс для добавления заданий и управления сервисами обработки и обслуживания заданий. Клиент создается с пулом базы данных, драйвером и структурой конфигурации, содержащей пакет
🤩 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)
}
👍10❤1🔥1
💡 Как можно тривиально реализовать типы sum/option на чистом Go, без использования сторонних пакетов или других хаков?
◆ Например, вы захотели, чтобы функция возвращала либо
◆ Тип
📌 Возможно ли это в Go?
◆ Да, но для этого нужно немного изменить концепцию интерфейсов. Интерфейсы описывают общее поведение, перечисляя одну или несколько функций. Каждый тип, который реализует эти функции, является экземпляром этого интерфейса.
◆ Однако тип
◆ Взгляните на этот интерфейс:
◆ Функция
◆ И обратите внимание, что
◆ Два варианта,
◆ Вот и все! Наш тип
◆ Опытные разработчики могут сказать, что возвращать интерфейс считается плохим стилем! И на это есть причина: если вызывающий получает обратно интерфейс, ему придется анализировать возвращаемое значение, чтобы определить конкретный тип за интерфейсом.
◆ Однако этот анализ возвращаемого значения является намеренной частью подхода типа
◆ Не волнуйтесь, определение варианта и действия на его основе требуют только переключения по типу возвращаемого значения и отдельного
◆ Но будьте осторожны: где бы вы ни писали такой переключатель типа
◆ К счастью, для этого есть линтер go-check-sumtype:
#tip
◆ Например, вы захотели, чтобы функция возвращала либо
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
GitHub
GitHub - alecthomas/go-check-sumtype: A simple utility for running exhaustiveness checks on Go "sum types."
A simple utility for running exhaustiveness checks on Go "sum types." - alecthomas/go-check-sumtype
🔥11❤6🥱6👍3😁2
🕹💻 Разработка игр на Go для абсолютных новичков
🤔 Чем занимаются разрабы в свободное время, если их изматывают текущие задачи? Ониотдыхают пишут ради удовольствия!
🤩 Miłosz Smółka, кофаундер Three Dot Labs и создатель Watermill, знакомит с фундаментальной игровой механикой 2D-аркады — от простого цикла рисования рамок до управления игровыми объектами, игроками и таймингами. В конце туториала вы узнаете, как написать игру Asteroids с помощью Go, Ebitengine и Donburi.
🤔 Чем занимаются разрабы в свободное время, если их изматывают текущие задачи? Они
🤩 Miłosz Smółka, кофаундер Three Dot Labs и создатель Watermill, знакомит с фундаментальной игровой механикой 2D-аркады — от простого цикла рисования рамок до управления игровыми объектами, игроками и таймингами. В конце туториала вы узнаете, как написать игру Asteroids с помощью Go, Ebitengine и Donburi.
🔥18👍3
⚒ DI и IoC в Go: что это, как работают и почему полезны
В качестве примера автор использует клиент REST API для инструмента мониторинга веб-приложений Monibot.
👉 Читать
В качестве примера автор использует клиент REST API для инструмента мониторинга веб-приложений Monibot.
👉 Читать
🔥12❤2🌚1
Добавление тестов в шаблоны проектов: гайд для Go-разработчика
Недавно автор разбирался с шаблонами проектов Go и тем, как вы можете использовать некоторые из них для быстрого начала работы с Go-проектом (пример шаблона для простого CLI на Go). Данным шаблонам не хватало только тестов👇
🔗 Читать
Недавно автор разбирался с шаблонами проектов Go и тем, как вы можете использовать некоторые из них для быстрого начала работы с Go-проектом (пример шаблона для простого CLI на Go). Данным шаблонам не хватало только тестов👇
🔗 Читать
Thomas Stringer
Creating and Using Go Project Templates
I love writing software in Go. It is by far what I’ve been using for the better part of many years now. Most of us developers (Go or otherwise) fall under one of two categories, or somewhere in between:
🔥8👍2🥱1
❗️Мы запускаем серию исследований — и вы можете нам в этом помочь!
«Библиотека программиста» выпустит несколько статей, в которых мы проведем полноценные исследования.
Помогите нам выбрать интересные темы: может быть, вы давно хотели узнать, как изменилась зарплата у тех, кто релоцировался? Или гадаете, сколько лет нужно, чтобы стать миддлом?
Присылайте интересующие вас темы в комментарии — интересные мы возьмем в работу и поделимся с вами результатами 💙
«Библиотека программиста» выпустит несколько статей, в которых мы проведем полноценные исследования.
Помогите нам выбрать интересные темы: может быть, вы давно хотели узнать, как изменилась зарплата у тех, кто релоцировался? Или гадаете, сколько лет нужно, чтобы стать миддлом?
Присылайте интересующие вас темы в комментарии — интересные мы возьмем в работу и поделимся с вами результатами 💙
👍2🔥2❤1
🤔 Python — лёгкий. Go — простой. Простой != легкий
Статья, посвященная симбиозу, который Preslav Rachev и его команда нашли при использования Python и Go.
Не менее интересно читать обсуждение на Hacker News. Присоединяйтесь!
Статья, посвященная симбиозу, который Preslav Rachev и его команда нашли при использования Python и Go.
Не менее интересно читать обсуждение на Hacker News. Присоединяйтесь!
Preslav Rachev
Python is Easy. Go is Simple. Simple != Easy.
Python and Go have distinct qualities that can complement each other.
🔥9🥱4
Если вы новичок в Go, у вас могут возникать вопросы вроде этих: «Почему функции обычно изменяют мапы и срезы, но не другие типы данных?», «Почему мой срез не изменяется, когда я добавляю к нему элементы в функции?», «Почему присваивание нового значения параметру-указателю не оказывает никакого эффекта за пределами функции?».
Цель руководства — дать понятные ответы на эти и другие вопросы и на простых примерах объяснить не самые очевидные аспекты Go.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🥱2❤1🔥1
Друзья, мы хотим делать для вас самый лучший контент — и для этого нам нужно узнать вас получше.
Пожалуйста, ответьте на несколько вопросов — это поможет нам делать более полезные и интересные посты!
Первая часть опроса 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2