🤔 Зачем писать свой велосипед? Возьми готовую либу и пользуйся! За тебя уже все написали
Вы наверняка слышали эту фразу от других разработчиков. Наличие инструмента/проекта/библиотеки для любой задачи — это одновременно как достоинство, так и недостаток современной разработки.
С одной стороны, они облегчают жизнь разработчикам и целым командам, а с другой — могут стать источником больших проблем: размер и скорость работы приложения, поддерживаемость кода, время на изучение библиотеки, баги, уязвимости и многое другое.
💬 А как в вашей команде обстоят дела со сторонними библиотеками? По каким критериям вы принимаете решение о внедрении их в проект?
#холивар
Вы наверняка слышали эту фразу от других разработчиков. Наличие инструмента/проекта/библиотеки для любой задачи — это одновременно как достоинство, так и недостаток современной разработки.
С одной стороны, они облегчают жизнь разработчикам и целым командам, а с другой — могут стать источником больших проблем: размер и скорость работы приложения, поддерживаемость кода, время на изучение библиотеки, баги, уязвимости и многое другое.
💬 А как в вашей команде обстоят дела со сторонними библиотеками? По каким критериям вы принимаете решение о внедрении их в проект?
#холивар
❤13👍1
Forwarded from Библиотека задач по Go | тесты, код, задания
Что выведет код?
Anonymous Quiz
42%
0 1 2 3
23%
0 2 4 6
3%
0 2 0 2
11%
Ошибка компиляции
21%
Посмотреть результаты
🥱19👍17🌚6
🥵 7 типов «сложных» разработчиков
Как найти подход к таким «сложным» типам и сделать работу в команде более эффективной и приятной? Рассказываем в статье, как с ними работать, чтобы избежать конфликтов и достичь общих целей.
Читать статью
#почитать
Как найти подход к таким «сложным» типам и сделать работу в команде более эффективной и приятной? Рассказываем в статье, как с ними работать, чтобы избежать конфликтов и достичь общих целей.
Читать статью
#почитать
👍3🔥1
💡Futures в Go — абстракция, представляющая результат асинхронной операции, который станет доступным в будущем.
В Go, для создания подобного поведения, обычно используются следующие компоненты: горутины и каналы.
1️⃣ Создаем канал, который будет содержать будущий результат:
2️⃣ Запускаем горутину для асинхронного вычисления результата:
3️⃣ Читаем из канала позже для получения результата:
В Go, для создания подобного поведения, обычно используются следующие компоненты: горутины и каналы.
1️⃣ Создаем канал, который будет содержать будущий результат:
resultChan := make(chan int)
2️⃣ Запускаем горутину для асинхронного вычисления результата:
go func() {
resultChan <- doLongComputation()
}()
3️⃣ Читаем из канала позже для получения результата:
result := <-resultChan
👍21🥱19
⚒️ 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