Библиотека 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
🚀Profile-guided optimization (PGO) в Go 1.21

Команда Go продолжает активность в официальном блоге — и это не может не радовать.

Что еще за PGO?

👉 Понимая, как код используется в продакшене, компилятор Go может оптимизировать наиболее часто используемые функции и сделать лучший выбор для распространенных случаев. Этот подход известен как profile-guided optimization.
👉 PGO использует данные профилирования для принятия обоснованных решений в процессе компиляции.
👉 Оценка, представленная в блоге, показывает, что включение PGO в Go 1.21 привело к улучшению использования ЦП примерно на 3,8% по сравнению со сборкой без PGO.
👉 PGO может обеспечить улучшение использования ЦП на 2-7% при типичных рабочих нагрузках, и ожидается, что будущие выпуски Go еще больше повысят производительность за счет PGO.

🤔 Звучит интересно, правда? А какие подводные камни?

Это может увеличить время сборки.
Вам необходимо начать собирать профилирующую информацию и управлять ею, если вы еще этого не сделали.
PGO может без проблем обрабатывать незначительные изменения в исходном коде, что делает его пригодным для постоянной разработки. Однако важно периодически обновлять профиль, чтобы он соответствовал изменениям в кодовой базе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🚀Производительность Cgo в Go 1.21

💡Cgo позволяет пакетам Go вызывать код C и обычно используется для предоставления Go-приложениям доступа к более широкому миру библиотек на основе C.

Последний раз производительность Cgo основательно измерялась командой Cockroach labs. С тех пор Go сильно изменился ― пришло время актуализировать информацию и понять, как обстоят дела.

Автор статьи Shane Hansen не хочет спорить о плюсах и минусах Cgo, но утверждает, что его производительность отличная, а накладные расходы в большинстве случаев незначительны.

👀 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3
🤔Если вы хотите вдохновиться идеей разработки интересного пет-проекта на Go, обратите внимание на сферу этичного хакинга в целом, и в частности на поиск уязвимостей в веб-приложениях. Она в себя включает очень много интересных тем.

🚀За примером далеко ходить не надо — команда ProjectDiscovery написала уже более десятка CLI-инструментов/библиотек на Go, которыми пользуются специалисты по кибербезопасности со всего мира. Вот самые интересные:

🔧subfinder — поиск поддоменов
🔧nuclei — сканирование уязвимостей
🔧aix — взаимодействие с API больших языковых моделей
🔧alterx — генерация словарей
🔧asnmap — сопоставление диапазонов сетей организации с использованием ASN
🔧cdncheck — обнаружение технологий по заданному IP-адресу
🔧chaos-client — взаимодействие с API Chaos DB
🔧cloudlist — получение активов от облачных провайдеров
🔧dnsx — dig/host/nslookup на стероидах
🔧httpx — многоцелевой набор HTTP-инструментов
🔧katana — сканирование веб-приложений и поиск информации — как паук в Burp Suite, только из командной строки
🔧mapcidr — получение информации для заданной подсети/диапазона CIDR
🔧naabu — сканер портов
👍12🔥73
💡Почему Context, вероятно, должен быть первым аргументом в большинстве ваших функций Go

В Go пакет context играет важную роль в управлении жизненным циклом вашего кода, особенно когда речь идет об обработке таймаутов, сигналов отмены и передаче значений, ограниченных запросом. Если вы разрабатываете API, принято передавать context.Context в качестве первого аргумента.

📌Вот почему:

1⃣Согласованность в экосистеме Go. Одной из основных философий Go является простота и предсказуемость. Когда разные библиотеки и приложения следуют одному и тому же соглашению, это снижает когнитивную нагрузку на разработчиков. Всегда передавая context в качестве первого аргумента, мы гарантируем, что Go-разработчики узнают этот шаблон, делая код более читаемым и поддерживаемым.

2⃣Передача значений. Пакет context не только предоставляет сигналы отмены, но и способ безопасного хранения и извлечения значений. Постоянно передавая его в качестве первого аргумента, вы гарантируете, что любые вложенные функции или методы, вызываемые внутри, имеют доступ к этим значениям, обеспечивая бесшовное распространение таких данных, как ID запроса и другие важные метаданные. Это становится действительно важным для реализации таких вещей, как трассировка.

3⃣Предотвращение длительных задержек и сбоев. Используя механизмы context для управления временем выполнения запросов, вы можете избежать длительных задержек и предотвратить переход от небольшой проблемы к крупному сбою.

🔗Источник

#tip
👍261🤩1
🎙️Подкаст GoGetPodcast: «Кто такой системный архитектор?»

Николай Тузов вместе с системным архитектором из LaTech Алексеем Скоробогатым обсуждают, кто такой системный архитектор, чем он занимается, зачем он нужен, как дорасти до этой позиции, и стоит ли. Вы узнаете про путь Алексея до архитектора, чем он занимается на работе и многие другие темы.

⏯️ YouTube | Apple Подкасты | Google Подкасты | Яндекс Музыка

#подкасты
👍6🔥31
🚀 Создание масштабируемых приложений с использованием Redis в качестве брокера сообщений

📝Под катом ― основные структуры данных Redis, которые можно использовать для создания решений для обмена сообщениями, каждая из которых проиллюстрирована примером приложения на Go.

👌Вы узнаете о Redis List, Redis Pub/Sub и Redis Streams, их ключевых различиях и кейсах использования.

🔗Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
⚖️ Логирование в Go: сравнение 8 лучших библиотек

С появлением в версии Go 1.21 нового базового стандартного пакета логирования (log/slog) другие библиотеки с открытым исходным кодом можно считать устаревшими? А вот и нет.

Надо смотреть в контексте достоинств/недостатков, производительности, гибкости, функциональных возможностей, простоты использования и поддержки сообщества. Об этом и пойдет речь в статье👇

👀Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔6👍1
Free Gophers Pack.png
3.5 MB
🤩🖼️ Если вы давно искали крутой бесплатный гофер-пак, у нас для вас есть кое-что.

🚀 Теперь ваши презентации, публикации в блогах или социальных сетях, курсы, видео и многое другое будут еще красивее.
Please open Telegram to view this post
VIEW IN TELEGRAM
12🎉2👍1
🔥 Вышла четвертая часть в серии руководств по работе с новым пакетом slices от Ardan Labs

William Kennedy на практике разбирается с принципом работы функций Contains, Delete и Equal.

👉 Перейти к серии
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Подробное руководство по операциям с файлами в Go: на заметку начинающему разработчику

Погрузитесь в мир файловых операций в Go и изучите расширенные концепции, включая манипулирование файлами, чтение, запись, обработка ошибок и многое другое.

🔗 Читать
👍12
🍪Хоть сейчас и мало кого заинтересуешь «печеньками» и «кикером в офисе», эйчары до сих пор в описаниях вакансий делают упор на удобном расположении офиса, бесплатном кофе и классных тимбилдингах.

🧗‍♀️Но это, скорее, верхушка айсберга и приятное дополнение к тому, что должно помогать сотруднику сохранять страсть к своей работе и не выгореть на первом же году работы. А «под водой» — интересные и разноплановые задачи, которые бросают вызов нашим скиллам и заставляют получать новые знания, и благодаря которым каждый день мы приходим на работу с удовольствием.

💬А что «зажигает» именно вас? Ради чего вы каждый день приходите на работу или садитесь за рабочий компьютер в случае удаленки? Как думаете, зависит ли счастье сотрудников от интересных задач?
9👍1
🤩 Команда Uber очень любит и развивает проекты с открытым исходным кодом, в том числе и на Go. В их техническом стеке Go тоже присутствует: cadence и H3-Go 👇
👍4
Forwarded from Библиотека программиста | программирование, кодинг, разработка
😴Вы ведь там не спите?! И правильно — ведь у нас для вас есть предложение отправиться в путешествие по техническому стеку Uber (аналогичный недавний пост про Netflix)

Иллюстрация основана на исследованиях из технических блогов Uber и проектов с открытым исходным кодом:

📌Фронтенд
• Веб: Fusion.js (React-фреймворк для создания надежных веб-приложений) + Visualization.js для сценариев геопространственной визуализации.
• Mobile: кроссплатформенная система RIB с архитектурой VIPER вместо MVC.

📌Бэкенд:
• Uber Gateway как динамическая конфигурация поверх Nginx. Сервис использует gRPC и QUIC для взаимодействия клиент-сервер, а также Apache Thrift для описания интерфейсов.
• Единое хранилище конфигураций под названием Flipr (позже измененное на UCDP), H3 в качестве библиотеки хранилища location-index, Spring Boot для сервисов на основе Java, uAct для архитектуры, управляемой событиями, и Cadence для оркестрации.

📌Базы данных: для OLTP используется DocStore, под капотом у которой MySQL + PostgreSQL + движок RocksDB.

📌Big data: управление осуществляется с помощью семейства Hadoop. В качестве форматов файлов используются Hudi и Parquet, а Alluxio — для кэширования. Данные временных рядов хранятся в Pinot и AresDB.

📌Обработка данных: Hive, Spark и фреймворк с открытым исходным кодом Marmaray + Apache Kafka и Apache Flink.

📌DevOps: Uber использует Monorepo с упрощенным окружением под названием devpod. CD управляется через Netflix Spinnaker, метрики передаются в uMetric, уведомления в uMonitor и базу данных observability M3.

🔗Подробнее

#инфографика #проектирование_систем
👍82🤔1🌚1
📚Найти подходящую для себя книгу по Go, которая принесет максимальную пользу, — не самая простая задача. Но решение есть: Awesome Go Books. Репозиторий поддерживается и обновляется новыми книгами. Пользуйтесь 😍

🔗GitHub

#перечитываястарое
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍3
Реализация плагина ClickHouse для Telegraf на Go

Telegraf — серверный агент для сбора и отправки всех показателей и событий из баз данных, систем и сенсоров IoT. А как на счет поддержи ClickHouse? Она есть, но имеет несколько недостатков.

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

👀Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🖼️📝Gophercon India 2023: краткие заметки с конференции

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

1⃣Rubiks-Kube
2⃣Is unit testing an afterthought or a necessity?
3⃣Generics in Go
4⃣Metaprogramming in Go
5⃣Fuzz testing
6⃣Cache design patterns
7⃣Checkpoint Restoration Using CRIU
8⃣Dive into debugging distributed systems using Delve
9⃣Hardening Go Concurrency: using Formal methods to verify correctness
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍1
🔗Cокращатель ссылок на Go: с нуля до деплоя

Go-разработчик Ильдар Карымов делится опытом разработки просто проекта на Go. Вы узнаете, как на практике использовать Echo и MongoDB, прикрутить GitHub-аутентификацию и задеплоить на Digital Ocean.

📺Смотреть
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
💬Что из себя представляет паттерн «Функциональные опции» в Go и как его реализовать?

▪️Паттерн «Функциональные опции» в Go предлагает гибкий способ настройки структур без раскрытия внутренних полей.

▪️Он особенно полезен, если вы хотите предоставить дополнительную конфигурацию, или в будущем могут появиться дополнительные параметры конфигурации. Он также отлично подходит для библиотек.

📌Базовый пример без функциональных опций:

type Server struct {
host string
port int
protocol string
}

func NewServer(host string, port int) *Server {
return &Server{
host: host,
port: port,
protocol: "http",
}
}


▪️Со временем наши требования меняются, и нам может понадобиться поддерживать больше вариантов конфигурации. Вместо изменения сигнатуры функции NewServer, что может быть проблематично и несовместимо с предыдущими версиями, мы можем использовать функциональные опции.

👉 Сначала мы определяем функциональную опцию:

type ServerOption func(*Server)

👉 и функцию, удовлетворяющую типу:

func WithPort (port int) ServerOption {
return func(s *Server) {
s.port = port
}


👉 изменяем нашу функцию NewServer:

func NewServer(host string, opts ...ServerOption) *Server {
server : = &Server{
host: host,
port: 443,
protocol: "https"
}

for _, opt : = range opts {
opt (server)
}

return server

}


👉 и теперь мы можем делать вот так:

server1 := NewServer("localhost")
server2 := NewServer("localhost", WithPort(8080))


📌Этот паттерн позволяет нам гибко настраивать параметры, сохраняя при этом читабельность и не раскрывая внутренние поля.
37🔥21👍10🌚3😁1