Go for Devs – Telegram
Go for Devs
1.07K subscribers
49 photos
17 videos
64 links
По сотрудничеству пишите в личные сообщения канала.
Download Telegram
🫡 Еженедельный дайджест №1

Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!

Generic интерфейсы в Go: просто, но сложно
Что нового в GoLand 2025.2?
Как проверить время и асинхронный код в Go?
Вышли минорные релизы Go — 1.25.1 и 1.24.7
Оптимизация памяти в Go: 20 приёмов для эффективных приложений
Как превратить SQL в полноценный API прямо в Go?

Самый популярный комментарий этой недели – комментарий к статье "Generic интерфейсы в Go: просто, но сложно" от пользователя @AuToMaton:

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


@go_for_devs
👍43🔥3
🔥 Как мы выследили регрессию использования памяти в продакшен-сервисах на Go 1.24

Команда Go for Devs подготовила перевод статьи о том, как команда инженеров выявила регрессию использования памяти в Go 1.24.

Оказалось, что всего одна оптимизация в аллокаторе памяти, случайно потерянная при рефакторинге, заставляла Go «съедать» сотни мегабайт RAM.

Но сообщество Go-разработчиков быстро нашло и устранило проблему 🫡

📚 Подробности на Хабр: https://habr.com/ru/articles/944718/
👍42🔥2
🤷 Зачем в Go интерфейсы требуют точного совпадения?

В Go компилятор иногда автоматически преобразовывает значение тика к указателю на этот тип. Если вызвать метод с pointer-receiver на значении, всё будет работать:


type User struct {
Name string
}

func (u *User) SetName(name string) {
u.Name = name
}

func (u User) PrintName() {
fmt.Println(u.Name)
}

var u User
u.SetName("Alice") // Go превратил это в (&u).SetName("Alice")
u.PrintName() // Обычный value-receiver


Но стоит подключить интерфейсы — и магия исчезает:


type Named interface {
SetName(string)
PrintName()
}

var u User
var n Named

n = &u // OK: *User реализует оба метода
n = u // Ошибка: User не имеет SetName


Почему так?

У User (значения) в method set только методы с value-receiver. У *User — и value-, и pointer-receiver. Автоматическое «взятие адреса» при работе с интерфейсами запрещено, потому что интерфейс хранит копию значения, а не сам объект.

Копия:
* неадресуемая,
* неизменяемая.

Если бы мы могли взять &n.(User), получили бы указатель на временную копию внутри интерфейса, которая теряется при новом присваивании. Это небезопасно.

Итог

* Интерфейсы всегда копируют значение.
* Копия не имеет адреса и не может изменяться.
* Поэтому Go не делает auto-addressing, и method set интерфейса и method set конкретного значения должны строго совпадать.
6👍6🔥2
🔝 Топ 5 возможностей Gin, которые должен знать каждый Go-разработчик

Даже если вы давно пишете API на Go, в арсенале Gin есть несколько приёмов, которые сделают ваш код быстрее, надёжнее и проще в сопровождении.

От кастомных валидаторов до graceful shutdown — фишки, о которых знают не все.

📚 Подробности на Хабр: https://habr.com/ru/articles/944724/
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2🔥2
🙏 Git bisect: быстрый способ найти баг

Вы когда-нибудь ловили баг в проекте, который «ещё вчера работал»?

Коммитов — целая гора, глазами не найти. Тут и выручает git bisect.

Это штука, которая делает бинарный поиск по истории. Вы указываете, где баг точно есть (git bisect bad HEAD), и где его точно не было (git bisect good abc123).

Дальше Git сам переключает вас на середину между "плохим" и "хорошим" кодом и говорит: «проверь».

Вы смотрите: баг есть → git bisect bad, бага нет → git bisect good.

И так несколько раз, пока Git не ткнёт пальцем в конкретный коммит: вот тут всё сломалось.

Фишка в том, что даже если между good и bad 100 коммитов, руками проверять придётся не сто, а всего 6–7. Логарифмы в действии 🙂

А если повезло, и баг можно проверить скриптом (например, тест падает с кодом 1) — вообще красота:


git bisect run ./test_bug.sh


Git сам пройдётся по истории и принесёт виновника на блюдечке.

Так что если в следующий раз придётся охотиться за багом — не спешите листать git log. Пусть git bisect сделает грязную работу 😉
6👍3🔥3
🆕 Новый экспериментальный API для JSON в Go

Спустя почти 15 лет после появления encoding/json в стандартной библиотеке разработчики столкнулись с его ограничениями.

В версии Go 1.25 появился экспериментальный encoding/json/v2 — он решает старые проблемы, добавляет потоковую обработку и повышает производительность.

📚 Подробности на Хабр: https://habr.com/ru/articles/945434/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥42
🔧 Целостность данных JSON-колонок в PostgreSQL

JSON всё чаще используют в реляционных базах данных — он позволяет хранить гибкие структуры и избавляет от избыточных связей между таблицами. Но вместе с удобством появляется риск: данные могут потерять предсказуемость.

Если не контролировать содержимое JSON-колонок, туда легко попадут неожиданные значения: числа вместо строк, объекты вместо массивов. В итоге приложение может «сломаться» на ровном месте.

В MySQL проверка JSON поддерживается из коробки. В PostgreSQL для этого есть расширение, которое позволяет валидировать данные по JSON-схеме прямо на уровне БД.

Пример: у нас есть таблица products с колонкой attributes, где хранятся характеристики товара.


CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
attributes JSON NOT NULL DEFAULT '{}'
);


Мы ожидаем, что поле tags внутри этого JSON будет массивом строк. Однако без строгой проверки на уровне базы данных нет гарантии, что кто-то не запишет туда числа, объекты или вообще что-то неподходящее.

Чтобы сохранить гибкость JSON и одновременно обеспечить строгую структуру данных, можно использовать валидацию JSON-схемы на уровне базы данных. Для этого нужно добавить constraint, который автоматически проверит соответствие содержимого JSON определенной схеме при каждой операции вставки или обновления.

Пример для PostgreSQL:


ALTER TABLE products ADD CONSTRAINT data_is_valid CHECK(
validate_json_schema(
'{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"additionalProperties": false
}',
attributes
)
);


Теперь, попытка вставить данные с невалидным значение для tags приведёт к ошибке:


INSERT INTO products (..., attributes) VALUES
(..., '{}'), -- Пустой объект, допускается
(..., '{"tags": []}'), -- Пустой массив строк
(..., '{"tags": ["test"]}'); -- Массив со строкой
-- Результат: Операция успешна

INSERT INTO products (..., attributes) VALUES
(..., '{"tags": [2]}'); -- Массив с числом вместо строки
-- Ошибка: Нарушен constraint
🔥65👍4
🪲 За пределами отладчика: полное руководство по отладке Go-приложений

В новой статье рассказываем о том, что баги бывают разными: воспроизводимые, случайные, гейзенбаги и конкурентные.

А в арсенале Go-разработчика должны быть — TDD, стратегическое логирование, Delve, git bisect и даже онлайн-отладчик GoTutor.

📚 Подробности на Хабр: https://habr.com/ru/articles/944732/
👍42🔥2
#GoHero ⭐️ Rob Pike

Команда Go for Devs считает важным рассказать о людях, которые внесли наибольший вклад в развитие языка Go и его экосистемы. В первом посте из серии #GoHero мы расскажем о Робе Пайке — человеке, чье имя давно стало легендой в мире компьютерных наук.

–––

Rob Pike — один из трёх создателей Go, наряду с Ken Thompson и Robert Griesemer. До этого он уже оставил яркий след в истории: участвовал в разработке Unix, Plan 9 и Inferno, а также был соавтором кодировки UTF-8.

Первые работы над Go начались в 2007 году внутри Google, а официально язык был представлен в ноябре 2009 года.

Pike сыграл ключевую роль в формировании философии Go: простота, читаемость и скорость разработки превыше всего.

Помимо инженерных достижений, Rob Pike известен и как автор книг: вместе с Brian Kernighan он написал «The Unix Programming Environment» и «The Practice of Programming».

Сегодня Rob Pike продолжает работать в Google, оставаясь важной фигурой в команде Go. Его влияние чувствуется не только в языке, но и в самой культуре разработки — от подхода к простоте кода до принципов открытого сообщества.
5👍3🔥1
🤖 Genkit Go 1.0: AI-фреймворк для продакшена

Команда Go for Devs подготовила перевод статьи о релизе Genkit Go 1.0 — open source AI-фреймворка от Google для экосистемы Go.

Теперь можно быстро и безопасно создавать продакшен-ready AI-приложения с типобезопасными флоу, поддержкой RAG, вызова инструментов и богатым локальным тулчейном.

📚 Подробности на Хабр: https://habr.com/ru/articles/946248/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥4🤯2
Используете ИИ-ассистентов для написания production-кода?
Anonymous Poll
61%
Да
18%
Нет
15%
Нет, но планирую начать
6%
Нет, и никогда не буду
👍31