Go for Devs – Telegram
Go for Devs
1.07K subscribers
49 photos
17 videos
64 links
По сотрудничеству пишите в личные сообщения канала.
Download Telegram
🤬 Почему Go до сих пор меня раздражает?

Ошибки на миллиард долларов, загадочный nil, проблемы с памятью и «магия» defer — по мнению автора, всё это делает язык излишне сложным и болезненным.

А стоит ли оно того?

📚 Подробности на Хабр: https://habr.com/ru/articles/951218/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😁4👍311👎1
🔥 Coming Soon в Go 1.26: нормальные указатели на значения

Вы точно сталкивались с тем, что указатель на структуру сделать легко, а вот на простое значение вроде int — уже приходится извращаться.


a := 77
b := &a
fmt.Println(*b) // 77


Это работает, но выглядит, мягко говоря, странно.

В Go 1.26 завезут следующее:


a := new(42)
fmt.Println(*a) // 42


То же самое будет работать и для строк, слайсов, даже для результата функции:


s := "hello"
ps := new(s)
fmt.Println(*ps) // hello

type Point struct { X, Y int }
pp := new(Point{X: 5, Y: 7})
fmt.Println(*pp) // {5 7}

f := func() string { return "GoLang" }
pf := new(f())
fmt.Println(*pf) // GoLang


На просторах интернета уже можно найти следующее:

“RIP всем самописным PointerTo[T any](in T) *T — теперь в стандартной библиотеке есть всё необходимое. Маленькое и незаметное изменение, но с огромным профитом.”


Единственный нюанс: new() всегда аллоцирует новое место и кладёт туда копию значения. То есть new(*p) сделает копию того, на что указывает p, а не новый указатель на тот же объект.

👍 Давай еще новостей про грядущий релиз
🔥 Фича топ
👍26🔥12🤔43
😋 Обедающие философы на Go: как не умереть от взаимной блокировки и голодания

В новой статье шаг за шагом решается классическая задача об обедающих философах на Go.

Вы узнаете, почему наивный подход ведёт к взаимной блокировке, как нарушить симметрию, чтобы избежать deadlock’а, и почему даже «рабочее» решение может оставить одного философа голодать вечно.

📚 Подробности на Хабр: https://habr.com/ru/articles/951224/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥3
🔥 Пишем микросервисы на Go как в BigTech, с нуля

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

Спикер представлил инструменты, которые могут значительно упростить этот процесс:
— gRPC для высокопроизводительного межсервисного взаимодействия;
— gRPC-Gateway для обеспечения совместимости с RESTful API;
— Buf для управления protobuf схемами;
— rk-boot для быстрого старта и стандартизации.

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

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

😉 СМОТРЕТЬ НА YOUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍32👎1
⚡️ Насколько быстр Go? Симуляция миллионов частиц на смарт-ТВ

Команда Go for Devs подготовила перевод статьи о том, насколько быстрым может быть Go. Автор проверил это на практике — написал симуляцию миллионов частиц с мультиплеером, только на CPU и так, чтобы оно работало даже на смарт-ТВ.

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

📚 Подробности на Хабр: https://habr.com/ru/articles/953434/
👏5👍4🔥21
Forwarded from AI for Devs
🐳 У Docker тоже есть свой агент — Gordon!

Кажется, многие пропустили, но релиз этого помощника состоялся уже какое-то время назад. Да, теперь и Docker не отстаёт от моды на ИИ — в Desktop и CLI появился собственный агент под именем Gordon. Отставить шуточки!

Gordon — это встроенный AI-ассистент, который умеет анализировать Dockerfile, искать ошибки, оптимизировать сборку, чинить контейнеры и даже мигрировать их на более безопасные Docker Hardened Images. Короче, если ваш контейнер внезапно “упал”, можно просто спросить:

docker ai "почему он упал?"


Идея логичная: собрать по-настоящему production-ready Dockerfile — задача не для слабонервных. Сотни нюансов, best-практики, уязвимости, кэш, слои, образы — на всё это Gordon теперь может хотя бы намекнуть.

Gordon встроен в Docker Desktop 4.38+ и CLI, но пока сидит в бете. Чтобы включить — надо активировать “Docker AI” в настройках. Конечно, Docker подчёркивает: данные шифруются, а запросы не используются для обучения моделей. Верим...

Документация
Блог-пост анонс
Демо на YouTube

@ai_for_devs
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥62😁2🤔1🤯1
👥 Группировка сабтестов в Go: от простого к сложному

Команда Go for Devs подготовила перевод статьи о том, как правильно группировать сабтесты в Go.

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

В статье разбираются плюсы и минусы разных подходов: от ручных t.Run до reflection-хаков и сторонних библиотек.

📚 Подробности на Хабр: https://habr.com/ru/articles/953418/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥42
🤨 Goiaba: Go-компилятор на Rust

Raph Amorim решил написать компилятор для Go… на Rust. Проект называется Goiaba (в переводе с португальского — гуава), и это пока эксперимент, но довольно показательный.
Автор известен по вкладам в экосистему WebAssembly и Wasmer. Его цель — исследовать, насколько реально собрать полноценный Go-компилятор с нуля на Rust, не используя LLVM, TinyGo или классический toolchain от Google.

• Goiaba написан на чистом Rust, без зависимостей от существующих Go-компиляторов.
• Потенциально может использоваться как библиотека внутри Rust-проектов.
• Может компилировать Go-код в WebAssembly, как TinyGo, но с иным подходом к архитектуре.
• Сообщество уже спорит, сможет ли он быть быстрее официального Go-компилятора (сомнительно, но Rust даёт шанс на более безопасные оптимизации).

На Hacker News обсуждение быстро скатилось в старую добрую войну “Rust vs Go”: кто быстрее компилирует.

> Скорость компиляции — не то, о чём я переживаю в Go. В отличие от Rust, с которым я почти не работаю — в том числе именно из-за скорости компиляции.

> Меня реально удивляет, что люди до сих пор жалуются на скорость компиляции Rust. Я работал с довольно большими проектами — отладочная сборка занимает несколько секунд, релизная — меньше минуты. Это точно не хуже, чем сборка TypeScript.


Такие эксперименты — тест на гибкость экосистемы. Появление альтернативных реализаций компиляторов укрепляет экосистему Go и открывает двери к новым сценариям — например, встраиванию Go в Rust-приложения или кроссплатформенным билдам без LLVM.

Репозиторий на GitHub
Обсуждение на Hacker News

@go_for_devs
🔥8👍52😁1
Forwarded from Cross Join - канал о разработке (Anton Okolelov)
Не, ну какие контрол-фрики эти правила придумывают

Может, еще пробелы по штангенциркулю подравнять?
😁9👍3😱3
🗑 Сборщик мусора в Go. Часть 3: Управление скоростью GC

Команда Go for Devs подготовила перевод статьи о том, как в Go устроено управление скоростью работы сборщика мусора.

TL;DR: даже при тысячах горутин GC подстраивается под нагрузку, выбирая между меньшим числом долгих пауз и большим числом коротких.

Итог — разработчику почти не нужно вручную «крутить» настройки, рантайм сам находит оптимальный ритм.

📚 Подробности на Хабр: https://habr.com/ru/articles/953426/

Первая статья из серии.
Вторая статья из серии.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥31
🪲 Cloudflare нашли редчайший баг — прямо в компиляторе Go для ARM64!

Да, это не опечатка: не рантайм, не race condition в их коде, а чистый косяк в сгенерированном машинном коде Go. И баг был настолько редким, что проявиться он мог только в инфраструктуре масштаба Cloudflare — при 84 миллионах HTTP-запросов в секунду.

На ARM64-машинах Cloudflare стали вылезать странные паники вроде traceback did not unwind completely — ошибка, указывающая на повреждённый стек при попытке раскрутки. Поначалу инженеры списали это на баг в старом коде с panic/recover, потом — на библиотеку Go Netlink. Но когда даже без неё паники продолжились, стало ясно: проблема глубже.

После недель отладки выяснилось: краш происходит при асинхронном вытестении (введённом в Go 1.14), когда рантайм прерывает горутину между двумя машинными инструкциями, корректирующими указатель стека. В этот момент стек оказывается в «разрезанном» состоянии — раскрутчик стека получает некорректный указатель и падает.

Инженеры написали минимальный Go-пример, где функция с большим стеком (>64 КБ) порождает тот самый двойной ADD. После пары минут работы программа стабильно умирала с SIGSEGV. Без сторонних библиотек. Только чистый Go.

package main

import (
"runtime"
)

//go:noinline
func big_stack(val int) int {
var big_buffer = make([]byte, 1 << 16)

sum := 0
// предотвращаем оптимизацию стека компилятором
for i := 0; i < (1<<16); i++ {
big_buffer[i] = byte(val)
}
for i := 0; i < (1<<16); i++ {
sum ^= int(big_buffer[i])
}
return sum
}

func main() {
go func() {
for {
runtime.GC()
}
}()
for {
_ = big_stack(1000)
}
}

Разобравшись, они подтвердили: это ошибка в компиляторе Go, который на ARM64 разбивает корректировку стека на две инструкции, не учитывая возможность асинхронного вытеснения между ними.

Go-команда признала баг и исправила его в версиях go1.23.12, go1.24.6 и go1.25.0.

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

Источник

@go_for_devs
👍10🔥9🤯61
Как структурировать маршруты в Gin

При разработке веб-API у вас часто бывает множество конечных точек, логически связанных между собой. Например, один набор маршрутов — для управления пользователями, другой — для работы с товарами, третий — для обработки заказов. Без должной организации ваш код быстро превращается в хаотичный набор маршрутов, который трудно читать, сопровождать и развивать.


r.GET("/books", getBooks)
r.POST("/books", createBook)
r.GET("/members", getMembers)
r.POST("/members", createMember)


Здесь на помощь приходит группировка маршрутов. Она позволяет объединять связанные маршруты под общим префиксом пути. Представьте, что вы создаёте «папки» для маршрутов: каждая группа содержит набор конечных точек, которые относятся друг к другу. Это не только повышает читаемость кода, но и упрощает применение общего поведения (например, middleware) к определённым группам маршрутов.


package main

import (
"github.com/gin-gonic/gin"
)

func main() {
r := gin.Default()

// Grouping book-related routes
bookGroup := r.Group("/books")
{
bookGroup.GET("/", getBooks)
bookGroup.POST("/", createBook)
}

// Grouping member-related routes
memberGroup := r.Group("/members")
{
memberGroup.GET("/", getMembers)
memberGroup.POST("/", createMember)
}

r.Run()
}


Заметьте, насколько чище стало: все маршруты, связанные с книгами, сгруппированы под /books, а все, связанные с читателями, — под /members. Это упрощает навигацию по коду и понимание его структуры.

📚 Подробности на Хабр: https://habr.com/ru/articles/955802/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥2🤯1
🫢 А вы знали, что у Go есть свой ML-фреймворк?

И называется он GoMLX, развивается с 2023 года — и, внимание, всё ещё жив! Последний коммит был пару недель назад.

GoMLX — это полноценный фреймворк на чистом Go, без Python и C++ под капотом. Он умеет всё, что должен уметь взрослый AI-инструмент: автодифф, готовые слои вроде LSTM и Attention, оптимизаторы (SGD, Adam), визуализацию, чекпоинты и даже метрики обучения.

За скорость отвечает OpenXLA/PJRT — тот же движок, что крутит JAX и TensorFlow. А если хочется поиграть — можно запустить модели прямо в браузере через WASM.

Разработчик уже показал демки: классификатор “кошки против собак”, diffusion-модель и даже AlphaZero-бот, который играет в настольную игру Hive. Всё это — на Go.

Конечно, GoMLX пока не собирается отбирать хлеб у PyTorch (будем честны, и не смог бы), но сам факт впечатляет: язык, который когда-то ассоциировался с микросервисами и горутинами, теперь присутствует и на территории машинного обучения.

GitHub
Туториал
Сравнение с Python
Попробовать

@go_for_devs
10👍7🔥5
⚡️ 1 000 000 узлов в Kubernetes

Кажется, кто-то снова решил побить рекорды: проект k8s-1m замахнулся на кластер из миллиона узлов.

Если вкратце:

1. Команда проекта разделила данные по степени важности. Критически важная информация сохраняется надёжно, а временные данные — такие как сигналы активности узлов — обрабатываются в упрощённом режиме, без избыточных гарантий. Это позволило значительно повысить производительность при большом числе операций.

2. Сетевой уровень построен на IPv6, что устраняет необходимость в NAT и дополнительной маршрутизации. Вместо одного централизованного планировщика используется распределённая схема: несколько независимых компонентов обрабатывают свои части кластера и передают результаты агрегатору. Такой подход снижает нагрузку и ускоряет распределение задач между узлами.

3. Основное ограничение выявилось не в самом Kubernetes, а в используемом хранилище данных. Стандартный etcd оказался узким местом при высокой частоте обновлений. В проекте его заменили на более лёгкую in-memory реализацию, что позволило увеличить скорость обработки и снизить задержки.

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

Полный обзор на Хабр
Инструкция по запуску

@go_for_devs
🔥5🤯42
💥 Как memory maps (mmap) обеспечивают в 25 раз более быстрый доступ к файлам в Go

Одно из самых медленных действий, которое можно совершить в приложении, — это системный вызов. Они медленные, потому что требуют перехода в ядро, а это дорогостоящая операция. Что делать, если нужно выполнять много операций ввода-вывода с диском, но при этом важна производительность? Один из вариантов — использовать memory maps.

Memory maps — это современный механизм Unix, позволяющий «включить» файл в виртуальную память. В контексте Unix «современный» означает появившийся где-то в 1980-х или позже. У вас есть файл с данными, вы вызываете mmap, и получаете указатель на участок памяти, где эти данные находятся. Теперь, вместо того чтобы делать seek и read, вы просто читаете по этому указателю, регулируя смещение, чтобы попасть в нужное место.

Производительность

Ниже сравнение производительности при чтении файла через memory map и через ReaderAt. ReaderAt использует системный вызов pread(), совмещающий seek и read, а mmap просто читает напрямую из памяти.


Случайное чтение (ReaderAt): 416.4 ns/op
Случайное чтение (mmap): 3.3 ns/op
---
Итерация (ReaderAt): 333.3 ns/op
Итерация (mmap): 1.3 ns/op


Почти как магия. Возможно кто-то из вас помнит Varnish Cache – ускоритель HTTP, разработанный для динамических веб-сайтов с большим количеством контента. В 2006 году именно эта возможность делала его настолько быстрым при выдаче контента. Varnish Cache использовал memory maps, чтобы доставлять данные с невероятной скоростью.

Кроме того, поскольку можно работать с указателями на память, выделенную memory map, снижается нагрузка на память и уменьшается общая задержка.

Обратная сторона memory maps

Недостаток memory maps в том, что по сути в них нельзя писать. Причина кроется в устройстве виртуальной памяти.
Когда вы пытаетесь записать в область виртуальной памяти, которая не отображена на физическую, процессор вызывает page fault. Современный CPU отслеживает, какие страницы виртуальной памяти соответствуют каким физическим страницам. Если вы пишете в страницу, которая не сопоставлена, процессору нужна помощь.

При page fault операционная система:

1. Выделяет новую страницу памяти.
2. Считывает содержимое файла по нужному смещению.
3. Записывает это содержимое в новую страницу.
4. Затем управление возвращается приложению, и оно перезаписывает эту страницу новыми данными.

Можно просто поаплодировать тому, насколько это неэффективно. Думаю, можно с уверенностью сказать: писать через memory map — плохая идея, если важна производительность, особенно если есть риск, что файл ещё не загружен в физическую память.

Вот несколько бенчмарков:

Запись через mmap, страницы не в памяти: 1870 ns/op
Запись через mmap, страницы в памяти: 79 ns/op
WriterAt: 303 ns/op


Как видно, наличие страниц в кэше критически влияет на производительность. WriterAt, использующий системный вызов pwrite, даёт куда более предсказуемые результаты.

Тем не менее, в начале Varnish Cache действительно писал через memory map. Как-то это срабатывало — в основном потому, что конкуренты тогда были гораздо хуже.

Источник

@go_for_devs
👍84🔥3👎2
💥 Google представил Green Tea GC — сборщик мусора, который экономит до 40% CPU

Новый сборщик мусора в Go – Green Tea GC – уже тестируют в продакшене Google, и результаты ошеломляют — до 40% меньше времени на сборку мусора.

Исследование провели инженеры Google — Michael Knyszek и Austin Clements. Их цель: адаптировать Go GC под современные многоядерные процессоры, где традиционные алгоритмы просто застревают в ожидании кэш-памяти. Green Tea дебютировал в Go 1.25 как эксперимент (через GOEXPERIMENT=greenteagc), и уже в Go 1.26 его планируют включить по умолчанию.

Главные инсайты:
🟣 Green Tea переходит от сканирования объектов к сканированию страниц памяти — это резко ускоряет обработку
🟣 В процессе сборки мусора теперь происходит меньше случайных обращений к памяти
🟣 В среднем — на 10% меньше CPU времени на GC, максимум — до 40% экономии
🟣 На новых CPU с AVX-512 ожидается ещё +10% ускорения благодаря векторным инструкциям
🟣 Уже к Go 1.26 это будет дефолтный GC (с возможностью откатить через GOEXPERIMENT=nogreenteagc)

Green Tea не появился из ниоткуда, он стал результатом многолетней командной работы. Идея родилась ещё в 2018-м, обрела форму в 2024-м, когда прототип писали в японских кафе за чашкой матча, и превратилась в продакшн-технологию в 2025-м (см. картинку). Это пример того, как одно простое инженерное озарение становится революцией, когда за ним стоит сообщество.

Источник

@go_for_devs
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍54🤔1🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
🥳 Go исполнилось 16 лет: главное о развитии языка и экосистемы

10 ноября языку Go стукнуло 16 лет с момента выхода в Open source — и команда подошла к дню рождения не с ностальгией, а с результатами.

Вот главное, что произошло вокруг именинника за последнее время:

🟣 К одному из самых заметных прорывов относится новый сборщик мусора Green Tea, который снижает накладные расходы на 10–40%. Для продакшн-сервисов это означает меньше пауз, стабильнее задержки и ощутимый выигрыш без каких-либо доработок в коде. Подробнее про него мы писали тут.

🟣 Не менее значимый апдейт — flight recorder для диагностики: он сохраняет последние миллисекунды жизни сервиса и позволяет понять, что случилось, даже если проблема проявилась спустя часы. Подробнее про него мы писали тут.

🟣 А ещё Go уверенно заходит в эпоху ИИ: официальный MCP SDK и интеграции в gopls формируют прочный фундамент для разработки агентных систем и инструментов прямо на Go.

Команда обещает, что это только начало — и обороты они точно снижать не собираются.

@go_for_devs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11👏4🔥21