Разрешение конфликтов в Git через стандартные инструменты часто превращается в мучение. Появился интересный TUI-инструмент на Go — ec, который делает этот процесс значительно удобнее.
ec использует трёхпанельный интерфейс в стиле IntelliJ: слева ours, по центру результат слияния, справа theirs. Инструмент показывает только конфликтные блоки, между которыми можно быстро переключаться через
n/p.Можно запустить просто ec без аргументов внутри репозитория с конфликтами – инструмент покажет список файлов и даст выбрать нужный. Есть интеграция с git mergetool через конфиг
[mergetool "ec"].В репозитории есть минималистичный плагин для Neovim, который открывает ec в терминальном буфере.
Важный момент: ec не запускает git add после записи результата – это остаётся на усмотрение пользователя.
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤5🥱1
🔄 Три Go обновления
Команда Go выпустила срочные обновления безопасности: стабильные версии Go 1.25.7 и Go 1.24.13, а также релиз-кандидат go1.26rc3. Релизы содержат исправления двух уязвимостей.
Исправления безопасности
• cmd/cgo — контрабанда кода через doc-комментарии. Расхождение между тем, как Go и C/C++ парсят комментарии, позволяло внедрять код в результирующий бинарный файл cgo. Теперь компилятор cgo больше не будет парсить пользовательские doc-комментарии.
• crypto/tls — неожиданное возобновление сессии при использовании
➡️ Анонсы про релизы и про релиз-кандидата
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive
Команда Go выпустила срочные обновления безопасности: стабильные версии Go 1.25.7 и Go 1.24.13, а также релиз-кандидат go1.26rc3. Релизы содержат исправления двух уязвимостей.
Исправления безопасности
• cmd/cgo — контрабанда кода через doc-комментарии. Расхождение между тем, как Go и C/C++ парсят комментарии, позволяло внедрять код в результирующий бинарный файл cgo. Теперь компилятор cgo больше не будет парсить пользовательские doc-комментарии.
• crypto/tls — неожиданное возобновление сессии при использовании
Config.GetConfigForClient. 📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4👍1😁1
Можно забыть про:
for i := 0; i < n; i++
С версии 1.22 пишем:
for i := range n { ... }Анализатор
rangeint автоматически подсказывает, где можно заменить. Работает, если переменная цикла и лимит не меняются внутри.Меньше букв, больше Go дзена.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🥱5😁2❤1😢1
Мем смешной, ситуация — не очень
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoGiggle
📍 Навигация: Вакансии • Задачи • Собесы
#GoGiggle
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15❤4👾1
Функция вызывает саму себя до инициализации. Код может запаниковать или выдать ответ? Давайте подумаем.
📍 Навигация: Вакансии • Задачи • Собесы
#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱11❤1👍1
Зачем Go-разработчику Python и агенты?
Даже если вы пишете микросервисы на Go, мир AI говорит на Python. Чтобы интегрировать умных агентов в свою архитектуру, нужно понимать, как они работают изнутри.
Курс «Разработка ИИ-агентов» стартовал. Мы разбираем архитектуру, которую можно перенести на любой язык, но кодим на Python.
Разбираем:
— паттерны взаимодействия агентов (
— работу с векторными БД (RAG);
— протоколы и API (то, с чем вам придётся интегрироваться).
—
Для прохождения нужны базовые знания Python. Первую лекцию открыли для всех.
Смотреть лекцию
Записаться на курс
Даже если вы пишете микросервисы на Go, мир AI говорит на Python. Чтобы интегрировать умных агентов в свою архитектуру, нужно понимать, как они работают изнутри.
Курс «Разработка ИИ-агентов» стартовал. Мы разбираем архитектуру, которую можно перенести на любой язык, но кодим на Python.
Разбираем:
— паттерны взаимодействия агентов (
A2A, иерархии);— работу с векторными БД (RAG);
— протоколы и API (то, с чем вам придётся интегрироваться).
—
Для прохождения нужны базовые знания Python. Первую лекцию открыли для всех.
Смотреть лекцию
Записаться на курс
🥱16❤1
Именованные возвращаемые значения — это когда переменные инициализируются автоматически и можно писать просто return без аргументов.
func rectangle(w, h float64) (area, perimeter float64) {
area = w * h
perimeter = 2 * (w + h)
return // Вернёт area и perimeter
}Плюсы
+ Документация в коде. Вместо загадочных
(string, string) видите (dir, file string).+ Удобство в defer. Именованная err доступна в defer, можно модифицировать результат после основной логики.
+ В коротких функциях с 1-2 возвратами избавляет от лишних объявлений.
Минусы
- Читаемость страдает. Когда функция больше экрана, голый return заставляет скроллить вверх. Явный return result, nil решает проблему мгновенно.
- Затенение — частая ошибка. Пишете
:= вместо = и создаётся новая переменная. Коварно с err: именованная остаётся nil, а локальная содержит ошибку. - Изменения через defer. Defer может модифицировать именованные переменные. Функция вернёт не то, что в return.
- Нули скрывают баги. Забыли присвоить результат — функция вернёт nil или 0. Без явного return сложнее заметить.
Правило: если нужно скроллить вверх, чтобы понять что возвращает return — используйте явный возврат.
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤3
You Aren't Gonna Need It (YAGNI) — один из ключевых принципов хорошего кода, который призывает не реализовывать функциональность на будущее.
Суть проста: не пишите код, который может когда-нибудь пригодиться. Реализуйте только то, что нужно прямо сейчас для решения текущей задачи.
Go и YAGNI: идеальное сочетание
Go изначально спроектирован с учётом принципа простоты. Создатели языка сознательно отказались от модных фич, оставив только необходимое. И это не баг, а фича.
Нарушение YAGNI:
// На будущее создаём сложную структуру с кучей полей
type User struct {
ID int
Name string
Email string
Phone string
Address string
SecondPhone string // может пригодится
FaxNumber string // вдруг понадобится
SocialLinks map[string]string // для будущей интеграции
}
// Универсальный метод на все случаи жизни
func (u *User) UpdateProfile(opts ProfileOptions) error {
// Сложная логика для сотни сценариев,
// из которых реально используется три
}
Go-компилятор настолько педантичен к чистоте кода, что даже не позволит собрать программу с неиспользуемыми переменными или импортами. Это встроенная защита от нарушения YAGNI на уровне языка.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤4🥱2
Разработчик решил не брать готовые решения типа Auth0 и создал полноценную систему двухфакторной аутентификации с нуля.
Результат — проект TickTOTP, который показывает, что за теми самыми 6-значными кодами, меняющимися каждые 30 секунд, стоит довольно элегантная логика.
Что внутри
Стек: Go для бэкенда, React + Vite + Tailwind для фронта, Redis для хранения секретов, всё упаковано в Docker Compose.
Три основных эндпоинта:
• Генерация TOTP-секрета и QR-кода
• Верификация 6-значного кода
• Проверка статуса пользователя
Автор отмечает, что для прода нужно добавить rate limiting, HTTPS, JWT-аутентификацию и резервные коды. Но как образовательный проект и база для своего решения — отличный старт.
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4🤩2
Go идеален для бэкенда. Но «мозги» пишут на Python
Вам не обязательно переходить на Python полностью, но понимать архитектуру AI-агентов необходимо, чтобы эффективно интегрировать их в свои Go-сервисы через API или gRPC.
На курсе мы разбираем архитектуру агентов: как они хранят состояние, как работают с инструментами (Tools) и протоколом MCP. Эти знания помогут вам строить надёжные мосты между высокопроизводительным Go-бэкендом и AI-логикой.
Что полезного для Go-разработчика:
— Понимание Model Context Protocol (MCP).
— Архитектура мультиагентных систем (оркестрация).
— Работа с векторными базами данных (актуально для любого языка).
Разобраться в архитектуре AI-систем
Вам не обязательно переходить на Python полностью, но понимать архитектуру AI-агентов необходимо, чтобы эффективно интегрировать их в свои Go-сервисы через API или gRPC.
На курсе мы разбираем архитектуру агентов: как они хранят состояние, как работают с инструментами (Tools) и протоколом MCP. Эти знания помогут вам строить надёжные мосты между высокопроизводительным Go-бэкендом и AI-логикой.
Что полезного для Go-разработчика:
— Понимание Model Context Protocol (MCP).
— Архитектура мультиагентных систем (оркестрация).
— Работа с векторными базами данных (актуально для любого языка).
Разобраться в архитектуре AI-систем
😁21🥱10❤1😢1🌚1
Собрали для вас самое главное за неделю.
— Fiber v3.0.0
— gopdfsuit v4.2.0
— Первый заказ на фрилансе
— Dota 2 + Go
— Ergo Framework v3.2.0
— Go 1.25.7, 1.24.13 и 1.26rc3
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🌚1
Разработчик сделал утилиту fixr, которая приводит текст к единому стилю форматирования. Документация, заметки в проектах и письма коллегам выглядят аккуратно без ручной правки.
fixr использует ИИ, можно указать ключи для ChatGPT, Claude и даже на локальные LLM, поднятые с помощью ollama.
Установка:
git clone https://github.com/stadicshock/fixr && cd fixr
go build -o fixr .
Настроить конфиг:
./fixr config init
# В ~/.fixr/config.yaml указать ключ
Исправить текст из буфера обмена:
./fixr fix -c
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱7❤3👍1😁1
Анализатор reflecttypefor из пакета modernize помогает заменить устаревшие
reflect.TypeOf на TypeFor в версиях 1.22+. Он находит места, где тип известен на этапе компиляции, и предлагает быстрые правки.Рефлексия использует
reflect.TypeOf для получения типа значения во время выполнения. Но если тип статический, TypeFor работает быстрее без лишних вычислений. Пример до/после:
reflect.TypeOf((*ast.File)(nil)) → reflect.TypeFor[*ast.File]()
В Go-проектах с рефлексией – десериализаторами, ORM или тестами – запустите анализатор.
gopls покажет предупреждения и автофикс, если запускаетесь в IDE.📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🤔1🥱1
Singleflight гарантирует, что дорогая операция выполняется только один раз, даже если тысячи горутин запрашивают один и тот же ресурс одновременно.
Проблема: Cache Stampede. Типичная ситуация:
• 10 000 запросов за одной статьёй попадают в сервис
• Кеш для этой статьи как раз протух
• Все 10 000 запросов одновременно идут в базу
• База падает от нагрузки
Это cache stampede — классическая проблема распределённых систем.
Решение
Singleflight гарантирует, что для одного ключа в любой момент выполняется только одна операция. Остальные ждут и получают тот же результат:
import "golang.org/x/sync/singleflight"
var group singleflight.Group
func GetUser(id string) (*User, error) {
v, err, shared := group.Do(id, func() (interface{}, error) {
// Эта функция выполнится только один раз
return db.Query("SELECT * FROM users WHERE id = ?", id)
})
if err != nil {
return nil, err
}
return v.(*User), nil
}
Что происходит в коде:
1. Первый запрос выполняет функцию
2. Остальные 9 999 запросов ждут его завершения
3. Все получают одинаковый результат
4. База получает 1 запрос вместо 10 000
Что умеет либа sync.singleflight:
Do() — синхронное ожидание:v, err, shared := group.Do(key, func() (interface{}, error) {
return expensiveOperation()
})DoChan() — с таймаутом:ch := group.DoChan(key, fetchData)
select {
case result := <-ch:
return result.Val, result.Err
case <-time.After(5 * time.Second):
return nil, fmt.Errorf("timeout")
}
Forget() — принудительный сброс:group.Forget(key) // Следующий запрос выполнится заново
Singleflight и кэш дополняют друг друга:
Запрос —→ Кеш? —→ Singleflight —→ База
↓ hit ↓ один запрос
Возврат Все ждут
Кэш — производительность при cache hit.
Singleflight — защита при cache miss.
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40❤7🔥3🌚1
Вчера на собеседовании админа спросили вопрос, который поставил его в тупик:
Возможно ли применить DRY в своей повседневной жизни
На собеседовании в голову так ничего не пришло, но спустя пару часов появился вариант с двумя входными дверьми в квартиру. В обычном жилом доме явно не нужно второй вход.
💬 Сможете придумать свой ответ? Есть ли у вас дубли в жизни?
📍 Навигация: Вакансии • Задачи • Собесы
#GoTalk
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚3❤2
🔄 Релиз Go 1.26
Команда Go представила версию 1.26 с улучшениями языка, рантайма и инструментария.
Ключевые нововведения:
➡️ Язык
• Функция new теперь принимает выражения с начальным значением
• Дженерики получили поддержку самоссылающихся типов для сложных структур данных
➡️ Производительность
• Green Tea GC теперь включён по умолчанию.
• Накладные расходы cgo сократились примерно на 30%
• Компилятор чаще размещает слайсы на стеке
➡️ Инструменты
• go fix переписан с нуля: автоматические модернизации кода под новые возможности языка
• Встроенные анализаторы помогают использовать фичи эффективнее
➡️ Стандартная библиотека
• Три новых пакета: crypto/hpke, crypto/mlkem/mlkemtest, testing/cryptotest
➡️ Экспериментальное:
• simd/archsimd — работа с SIMD-инструкциями
• runtime/secret — безопасная очистка криптографических данных
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive
Команда Go представила версию 1.26 с улучшениями языка, рантайма и инструментария.
Ключевые нововведения:
• Функция new теперь принимает выражения с начальным значением
• Дженерики получили поддержку самоссылающихся типов для сложных структур данных
• Green Tea GC теперь включён по умолчанию.
• Накладные расходы cgo сократились примерно на 30%
• Компилятор чаще размещает слайсы на стеке
• go fix переписан с нуля: автоматические модернизации кода под новые возможности языка
• Встроенные анализаторы помогают использовать фичи эффективнее
• Три новых пакета: crypto/hpke, crypto/mlkem/mlkemtest, testing/cryptotest
• simd/archsimd — работа с SIMD-инструкциями
• runtime/secret — безопасная очистка криптографических данных
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥11👏4
Каждый разработчик на Go должен написать свой инструмент. Вот ещё один пример отличного проекта.
gottp — это альтернатива Postman и Insomnia для тех, кто живёт в терминале.
Проект поддерживает HTTP/REST, GraphQL, WebSocket и gRPC. Коллекции запросов хранятся в YAML-файлах, есть переменные окружения с интерполяцией, а импортировать данные можно из cURL, Postman или Insomnia.
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥8
Middle+ Golang-разработчик (ИИ-код) — 230 000 - 320 000 ₽. Удаленно (Москва)
Senior Golang Engineer в команду Отелло — до 550 000 ₽. Гибрид/Офис (Москва, Санкт-Петербург, Новосибирск)
Junior Go Developer — от 75 000 до 120 000 ₽. Удаленно (Казань)
#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
3❤3
benchmark_test.go
11 KB
🚀 5 техник оптимизации Go
Оптимизация в Go нужна, когда приложение упирается в CPU, память или задержки в проде. Но Дональд Кнут прав: преждевременная оптимизация портит код, так что сначала замерьте узкие места.
Запускайте бенчмарки через
Для глубокого анализа используйте pprof: импортируйте
Полный бенчмарк приложим отдельным файлом. Ниже будут сами техники.
📎 Преаллокация слайсов
Слайсы в Go динамические — они растут, когда заканчивается место.
Если знаете размер заранее, то укажите ёмкость:
При указанной ёмкости будет 0 реаллокаций и предсказуемое потребление памяти. Лучше выделить чуть больше памяти, чем делать реаллокации.
📎 strings.Builder для строк
Строки в Go иммутабельны. Каждая операция
Правило: если видите
📎 Избегание конверсий []byte в string
Слайсы байт — изменяемые, а строки нет. Чтобы гарантировать, что строка не изменится, при конверсии
Работайте с одним типом до конца. Если данные пришли как
Unsafe вариант. Используйте осторожно — только если
Zero-copy, но небезопасно eсли
📎 Буферы для I/O
Каждый вызов
Ядро эффективнее обрабатывает большие блоки данных, чем россыпь мелких запросов.
Eсли делаете >100 операций I/O в цикле — используйте буферизацию.
📎 Выравнивание полей в структурах
Процессор читает память словами — на 64-bit системе — 8 байт за раз. Если поле структуры не выровнено на границу слова, CPU придётся делать два чтения вместо одного.
Чтобы этого избежать, компилятор добавляет отступы — пустые байты для выравнивания. Но если поля расположены неоптимально, отступ может съесть много памяти.
Правила выравнивания:
• Сортируйте поля от большего к меньшему размеру
• Группируйте маленькие поля вместе
• Используйте инструменты для проверки
Эти техники — инструменты для конкретных проблем, а не обязательный чеклист для каждого проекта.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
Оптимизация в Go нужна, когда приложение упирается в CPU, память или задержки в проде. Но Дональд Кнут прав: преждевременная оптимизация портит код, так что сначала замерьте узкие места.
Запускайте бенчмарки через
go test -bench=. -benchmem или go test -cpu=1,2,4. Они покажут наносекунды на операции, аллокации и объекты в GC.Для глубокого анализа используйте pprof: импортируйте
net/http/pprof, соберите профиль curl localhost:8080/debug/pprof/profile?seconds=30, разберите go tool pprof.Полный бенчмарк приложим отдельным файлом. Ниже будут сами техники.
Слайсы в Go динамические — они растут, когда заканчивается место.
Если знаете размер заранее, то укажите ёмкость:
make([]int, 0, известныйРазмер)
При указанной ёмкости будет 0 реаллокаций и предсказуемое потребление памяти. Лучше выделить чуть больше памяти, чем делать реаллокации.
Строки в Go иммутабельны. Каждая операция
s = s + "x" создаёт новую строку, копируя старую.strings.Builder — это буфер, который растёт как слайс. Вы добавляете части, а в конце получаете готовую строку одним вызовом String().Правило: если видите
s += something в цикле — меняйте на Builder.Слайсы байт — изменяемые, а строки нет. Чтобы гарантировать, что строка не изменится, при конверсии
string([]byte) Go всегда копирует данные. Даже если вы не планируете менять слайс.Работайте с одним типом до конца. Если данные пришли как
[]byte — используйте функции для []byte.data := []byte("payload")
str := string(data) // копирование
if strings.Contains(str, "error") { ... }
// Без копирования
if bytes.Contains(data, []byte("error")) { ... }Unsafe вариант. Используйте осторожно — только если
[]byte не изменяется:func unsafeString(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}Zero-copy, но небезопасно eсли
[]byte освободится — строка будет указывать на мусор.Каждый вызов
Write() в файл или сеть — это системный вызов. Программа переключается, ядро делает операцию, возвращает управление. Это дорого.Ядро эффективнее обрабатывает большие блоки данных, чем россыпь мелких запросов.
bufio.Writer — буфер для таких вызовов. Вы пишете в буфер, когда буфер заполнится или вы вызовете Flush() — данные уходят одним большим куском.Eсли делаете >100 операций I/O в цикле — используйте буферизацию.
Процессор читает память словами — на 64-bit системе — 8 байт за раз. Если поле структуры не выровнено на границу слова, CPU придётся делать два чтения вместо одного.
Чтобы этого избежать, компилятор добавляет отступы — пустые байты для выравнивания. Но если поля расположены неоптимально, отступ может съесть много памяти.
Правила выравнивания:
• Сортируйте поля от большего к меньшему размеру
• Группируйте маленькие поля вместе
• Используйте инструменты для проверки
Эти техники — инструменты для конкретных проблем, а не обязательный чеклист для каждого проекта.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20👍6
Чтобы ваши агенты не были такими глупыми приходите на наш курс по разработке AI-агентов
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoGiggle
📍 Навигация: Вакансии • Задачи • Собесы
#GoGiggle
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7❤4