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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
🙇‍♂️Коллекция тестовых заданий для самостоятельного выполнения от разных ИТ-компаний, собранная сообществом вместе с командой Хекслет: маст-хэв при подготовке к собесу.

🔗 GitHub
🥳Сегодня четырнадцатый день рождения релиза Go с открытым исходным кодом: за плечами у команды Go и сообщества два полнофункциональных релиза и другие важные фичи

☑️Выпуски Go 1.20 в феврале и Go 1.21 в августе
☑️Завезли profile-guided optimization и встроенное управление тулчейном
☑️Добавлена поддержка сбора профилей покрытия в бинарных сборках, созданных go build
☑️Совместимость еще больше улучшена за счет расширения соглашений об использовании GODEBUG
☑️Новый пакет структурированного логирования и многие другие изменения стандартной библиотеки

👉 Подробнее в статье Расса Кокса
Гайд по разработке системы уведомлений в реальном времени с помощью Go + Kafka:

Что такое Kafka?
Как настроить рабочее пространство проекта?
Как создать модели пользователя и уведомлений?
Как настроить Kafka producer?
Как настроить Kafka consumer?
Тестирование проекта

👉 Читать
🔍Статические SQL-запросы часто оказываются недостаточными при необходимости создания условных запросов, а разработка динамических запросов в Go требует глубоких знаний SQL и тонкостей работы с языком.

🤔Проблемы включают предотвращение SQL-инъекций, использование параметризованных запросов, управление сложностью запросов, оптимизацию производительности и поддержание читаемости кода.

📚В статье рассмотрены стратегии и библиотеки, предназначенные для решения этих проблем, и представлена новая библиотека под названием tqla, которая использует пакет text/template для безопасной генерации динамических условных SQL-запросов.

t, err := tqla.New(tqla.WithPlaceHolder(tqla.Dollar), tqla.WithFuncMap(exampleFuncs))
if err != nil {
return err
}

insertStmt, insertArgs, err:= t.Compile(`{{ $length := sub ( len . ) 1 }}
INSERT INTO 'todos' ('id', 'title', 'description', 'completed', 'created_at')
VALUES {{ range $i, $v := . }}
( {{$v.Id}}, {{$v.Title}}, {{$v.Description}}, {{ $v.Complete }}, {{ $v.CreatedAt }} ){{if lt $i $length}},{{else}};{{end -}}
{{end}}`, todos)

if err != nil {
return err
}

_, err := db.Exec(insertStmt, insertArgs...)


👉 GitHub
🔧NilAway — инструмент статического анализа для обнаружения потенциальных nil-паник в коде на Go, который позволяет ловить их во время компиляции, а не во время выполнения.

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

var p *P
if someCondition {
p = &P{}
}
print(p.f)


Результат👇

go.uber.org/example.go:12:9: error: Potential nil panic detected. Observed nil flow from source to dereference point:
-> go.uber.org/example.go:12:9: unassigned variable p accessed field f
Разработка высокопроизводительного синтаксического анализатора JSON: от теории к практике

Создать синтаксический анализатор JSON непросто, а создать быстрый — еще сложнее. В выступлении на GopherCon Signapore 2023 Дэйв Чейни демонстрирует, как написать высокопроизводительный синтаксический анализатор JSON. Ниже — сценарий выступления, превращенный в статью в блоге.

👉 Читать
📊 Егор Толстой и Анна Симонова опросили 500 Go-разработчиков и узнали много интересного: для каких задач используют Go, насколько часто применяют дженерики, какие инструменты в арсенале. А кроме этого, собрали большой список самых полезных книг, курсов, подкастов и Telegram-каналов.

📌Основные тезисы:

◆ Большинство участников опроса оценивают свой уровень как Middle и Senior.
◆ До Middle Go-разработчик обычно растет 1-2 года, а тимлидом может стать уже через 3.
◆ В основном Golang применяется в продуктовой разработке на проектах большого масштаба.
◆ Большинство пришло в Go из других ЯП. Среди неожиданных профессий: кладовщик, нефтяник, врач и музыкант. 17% Go‑разработчиков начали свою карьеру в IT сразу с Golang. Чаще всего в Golang приходят из Python и PHP.
◆ Для большинства опрошенных Go — основной язык программирования.
◆ Почти половина опрошенных в качестве второго регулярно используемого языка выбирают Python. А треть — JavaScript.
◆ Половина опрошенных переписывала сервисы на Go с других языков. В основном с PHP.
◆ Подавляющее большинство опрошенных используют Go для микросервисов.
◆ Основная IDE для работы — GoLand / IntelliJ IDEA.
◆ Больше половины Go-разработчиков работают с macOS.
◆ Абсолютное большинство готово использовать Go не только для работы, но и для написания пет‑проектов.
◆ Вне зависимости от грейда, Go‑разработчики заинтересованы в прокачке знаний по архитектуре и распределенным системам.
◆ Дженерики ждали все, а в итоге регулярно используют только 10% разработчиков.
◆ Каждый пятый Go-разработчик ждет того часа, когда в языке оптимизируют процесс обработки ошибок.
◆ Лишь треть опрошенных пользуется AI‑инструментами на регулярной основе.
◆ Основные источники знаний для большинства Go-разработчиков — это чтение статей и просмотр YouTube.
◆ Каждый шестой Go-разработчик открывал в этом году книги Роберта Мартина.
◆ Треть разработчиков обучались Go не самостоятельно, а на профильных курсах.
◆ 30% Go-разработчиков живут не в России. Больше половины переехали в последние 1,5 года.
◆ Большинство Go-разработчиков не планируют менять место работы.
◆ Самый частый способ выхода из Go — переход в управление разработкой или смена ЯП.
◆ 40% тех, кто хочет сменить язык программирования, в первую очередь смотрят на Rust.

👉 Читать исследование

#аналитика
⚒️Как использовать ресурсы Kubernetes по максимуму для работы с Go-приложениями

Антон Жуков, руководитель группы разработки в Сбермаркете, делится опытом работы с Kubernetes.

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

В конце описан кейс настройки GOMAXPROCS на примере реального приложения, которая привела к повышению производительности на 20-50%.

👉 Читать
🤔 Сложно ли поменять стек разработки?

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

✔️Изучение нового языка
✔️Ознакомление с экосистемой языка
✔️Понимание инфраструктуры (сборка, доставка и т. д.)

💬 А вы меняли стек? Сколько времени это заняло?

#холивар
This media is not supported in your browser
VIEW IN TELEGRAM
🤩Следующее поколение CLI

Charmbracelet, создатели CLI-пакетов для Go, задумали что-то грандиозное. Они собрали 6 миллионов долларов на создание CLI-инструментов «следующего поколения».

Подробности о планах еще впереди, а сейчас можно ознакомиться с пакетами и инструментами, которые Charmbracelet выпустила на данный момент: от Glow, Glamour и LipGloss до SoftServe, Wish и VHS.

👉 Читать
💡Различные способы использования go get

🔸Вы, конечно, знаете, как получить последнюю версию модуля:

Либо для конкретного модуля...

$ go get golang.org/x/net


...либо для всех зависимостей главного модуля:

$ go get -u ./...


🔸Чтобы обновить все зависимости до последних патч-релизов текущей версии, используйте:

$ go get -u=patch ./...


🔸Но это еще не все. Например, вы можете обновить или понизить версию модуля до конкретной версии:

$ go get golang.org/x/text@v0.3.2


🔸Вы не ограничены использованием семантического номера версии. Вы можете использовать @latest, чтобы обновиться до последней версии, или @patch, чтобы обновиться до последнего патч-релиза. Или можете указать конкретную ветку VCS.

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

$ go get golang.org/x/text@main


🔸Вы даже можете удалить зависимость. Эта операция даже понижает версии модулей:

$ go get golang.org/x/text@none


🔸Команда go get может быть применена даже к инструментарию Go. Эта команда обновляет минимально требуемую версию Go для главного модуля (то есть обновляет директиву go в go.mod) и даже загружает последнюю или указанную версию инструментария, если это необходимо:

$ go get go
$ go get go@v1.21.4


🔸Начиная с Go 1.21, go mod также может предложить версию инструментария Go для компиляции модуля, используя директиву toolchain (в отличие от директивы go, которая устанавливает минимально требуемую версию Go для модуля). Директива go остается неизменной. Как и в случае с go get, вы можете использовать @patch, чтобы обновиться до последнего патч-релиза текущего инструментария Go.

$ go get toolchain
$ go get toolchain@v1.21.4
$ go get toolchain@patch
💡Начиная с Go 1.22, функции Delete/DeleteFunc/Compact/CompactFunc/Replace в пакете стандартной библиотеки slices обнуляют освобожденные элементы, чтобы избежать потенциальной утечки памяти.

👉 Речь про этот proposal.

#новости
🧰cpuid — библиотека, которая предоставляет информацию о ЦП без использования CGO: количество физических и логических ядер, семейство ЦП и другие сведения.

☑️На данный момент поддерживает x86/x64 и Arm64. Не использует никакого CGO.

package main

import (
"fmt"
"strings"

. "github.com/klauspost/cpuid/v2"
)

func main() {
// Print basic CPU information:
fmt.Println("Name:", CPU.BrandName)
fmt.Println("PhysicalCores:", CPU.PhysicalCores)
fmt.Println("ThreadsPerCore:", CPU.ThreadsPerCore)
fmt.Println("LogicalCores:", CPU.LogicalCores)
fmt.Println("Family", CPU.Family, "Model:", CPU.Model, "Vendor ID:", CPU.VendorID)
fmt.Println("Features:", strings.Join(CPU.FeatureSet(), ","))
fmt.Println("Cacheline bytes:", CPU.CacheLine)
fmt.Println("L1 Data Cache:", CPU.Cache.L1D, "bytes")
fmt.Println("L1 Instruction Cache:", CPU.Cache.L1I, "bytes")
fmt.Println("L2 Cache:", CPU.Cache.L2, "bytes")
fmt.Println("L3 Cache:", CPU.Cache.L3, "bytes")
fmt.Println("Frequency", CPU.Hz, "hz")

// Test if we have these specific features:
if CPU.Supports(SSE, SSE2) {
fmt.Println("We have Streaming SIMD 2 Extensions")
}
}


👉 GitHub
💪 Уровни в айти-индустрии обычно отличаются опытом, знаниями, навыками, ответственностью и зарплатой. Но в одной компании вас могут оценить как сильного мидла, а в другой — как среднего джуна.

💬 Как вы считаете, какими навыками должны обладать джуны, мидлы и сеньоры?

#холивар
🤯Многие распространенные приложения на основе LLM, такие как RAG (Retrival Augmented Generation), имеют некоторые проблемы с пайплайном данных, и Go действительно хорош в этом.

⚒️Реализация RAG на Go очень проста — смотрите пример в блоге Eli Bendersky или на GitHub.
📌По мотивам поста в сабреддите golang:

🔧 Kubernetes: автоматизация развертывания, масштабирования и управления контейнеризированными приложениями
🔧 Terraform: управление внешними ресурсами
🔧Hugo: генерация статических сайтов
🔧 Syncthing: непрерывная синхронизация файлов
🔧 Prometheus: система мониторинга и оповещения о событиях, хранящая данные в виде временных рядов
🔧 RudderStack: сбор данных о клиентах из различных приложений, веб-сайтов и SaaS-платформ
🔧 frp: быстрый реверс-прокси
🔧 fzf: нечеткий поиск в командной строке
🔧 act: локальный запуск GitHub Actions
🔧 Gogs: self-hosted сервис Git
🔧 gitea: легковесная DevOps-платформа
🔧 Minio: высокопроизводительное хранилище объектов для ИИ
🔧 tidb: облачная распределенная БД, совместимая с MySQL
🔧 Photoprism: работа с изображениями на базе ИИ
🔧 Gitpod: быстрая и безопасная облачная разработка
🔧 faas: упрощение serverless функций
🔧 nsq: платформа распределенного обмена сообщениями

💭Есть чем дополнить? Пишите в комментарии👇
Три паттерна конкурентного кода: гайд для Go-разработчика

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

Именно так получилось у автора статьи. Он встретил логику ограничения потоков выполнения, основанную на результате выполнения функции GOMAXPROCS(0), которая по умолчанию будет равна runtime.NumCPU.

Это подходит под паттерн с параллельными вычислениями на одном процессоре, но использовалось для ограничения количества одновременных запросов к удаленному серверу.

👉 Читать
⚡️Николай Тузов выпустил гайд (видео 3,45 ч. + туториал на Хабре) по разработке полноценного gRPC-сервиса с современной архитектурой.

📌Что внутри:

• Разработка простого, но полноценного gRPC-сервиса
• Разбор базовых принципов работы авторизации
• Настройка автоматического деплоя в прод
• Интеграция с уже готовым сервисом URL Shortener
• Разработка полноценных функциональных тестов и многое другое
🎥 Теории кэширования по полочкам: запись урока от Владимира Балуна

📌Что внутри:

01:03 — Что такое кэширование
03:18 — Основные термины кэширования
04:55 — Какие данные кэшировать
06:02 — Кэширование ошибок
07:13 — Как предотвратить cache miss attack
10:34 — Эффективность кэширования
12:56 — Внутреннее кэширование
14:41 — Внешнее кэширование
19:23 — Cache Aside
21:32 — Cache Through
23:16 — Cache Ahead
29:33 — Алгоритмы вытеснения данных из кэша
30:01 — Random алгоритм
30:23 — FIFO алгоритм
30:49 — LIFO алгоритм
31:16 — LRU алгоритм
32:06 — MRU алгоритм
32:29 — LFU алгоритм
37:11 — Алгоритм Белади (OPT)
38:13 — Second Chance алгоритм
39:56 — Clock алгоритм
40:40 — 2Q алгоритм
41:42 — SLRU алгоритм
42:49 — TLRU алгоритм
43:17 — LRU-k алгоритм
47:24 — Инвалидация данных в кэше
47:41 — Инвалидация по TTL
48:35 — Jitter
49:40 — Thundering herd problem
51:13 — Инвалидация по событию
52:41 — Версионирование кэша
56:11 — Тегирование кэша
1:03:37 — Многомерный кэш