Go for Devs – Telegram
Go for Devs
1.07K subscribers
49 photos
17 videos
64 links
По сотрудничеству пишите в личные сообщения канала.
Download Telegram
🎬 What’s new in Go 1.24 (Google for Developers)

Нашли, чем заняться вечером — погрузитесь в нововведения Go 1.24: от пост‑квантовой криптографии до полной поддержки обобщённых типовых псевдонимов, от усовершенствований кеширования инструментов до новых возможностей стандартной библиотеки.

😉 СМОТРЕТЬ НА YOUTUBE
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥4
🙈 Будьте осторожны с Struct Embedding в Go

В Go есть механизм встраивания структур (struct embedding), который позволяет составлять типы. Примерно это выглядит так:


type Position struct {
X int
Y int
}

type Colour struct {
R byte
G byte
B byte
}

type Rectangle struct {
Position
Colour

Width int
Height int
}

r := Rectangle{/* ... */}

// This works:
fmt.Printf("%d,%d\n", r.Position.X, r.Position.Y)

// but so does this:
fmt.Printf("%d,%d\n", r.X, r.Y)


А как вы думаете, что делает этот код?


type FooService struct {
URL string
}

type BarConnectionOptions struct {
URL string
}

type BarService struct {
BarConnectionOptions
}

type Options struct {
FooService
BarService
}

opts := Options{
FooService: FooService{URL: "abc.com"},
BarService: BarService{
BarConnectionOptions: BarConnectionOptions{
URL: "xyz.com",
},
},
}

fmt.Println(opts.URL)


Я бы ожидал, что компиляция упадет из-за неоднозначности поля URL. На самом деле программа выводит abc.com, по всей видимости, выбирая наименее вложенную версию этого поля. Такое у нас случилось на работе, к счастью, это поймали тесты. Будьте внимательны при встраивании структур!
👍64🔥4
🛠 Generic интерфейсы в Go: просто, но сложно

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

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

📚 Подробности на Хабр: https://habr.com/ru/articles/942634/
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥4
🔥 Что нового в GoLand 2025.2?

В этом релизе — умное выявление ошибок с помощью анализа потоков данных, неблокирующий экран приветствия, улучшенный поиск HTTP-эндпоинтов и ускоренный AI-агент Junie.

А ещё — апгрейд JetBrains AI Assistant и свежие функции, унаследованные от IntelliJ IDEA, WebStorm и DataGrip.

📚 Подробности на Хабр: https://habr.com/ru/articles/942868/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥2
Как проверить время и асинхронный код в Go?

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

Он позволяет писать быстрые и надёжные тесты для конкурентного кода, не усложняя сам код. Теперь асинхронные операции можно проверять без долгих ожиданий и флаки-тестов.

📚 Подробности на Хабр: https://habr.com/ru/articles/943412/
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥2
🚀 Вышли минорные релизы Go — 1.25.1 и 1.24.7!

В обновлениях исправлена одна уязвимость в соответствии с политикой безопасности Go:

🟣 net/http: CrossOriginProtection bypass patterns
При использовании CrossOriginProtection.AddInsecureBypassPattern запросы, которые должны были редиректиться (например, без завершающего слэша), также попадали в список исключений. Это могло привести к неожиданному поведению. Уязвимость зарегистрирована как CVE-2025-47910 (Go issue #75054).

⬇️ Скачать бинарные и исходные сборки можно на тут.

#release #minor
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥2
🧠 Оптимизация памяти в Go: 20 приёмов для эффективных приложений

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

Автор делится двадцатью приёмами — от выбора ресивера метода и правильной инициализации slice до кастомного управления памятью и профилирования с pprof.

TL;DR: мелкие улучшения складываются в заметный прирост производительности и стабильности.

📚 Подробности на Хабр: https://habr.com/ru/articles/943664/
4👍2🔥2
🌍 Как превратить SQL в полноценный API прямо в Go?

В новой статье делимся информацией о том, как можно безопасно принимать WHERE-условия в виде SQL-подзапросов, валидировать их и использовать для запросов к базе.

Просто, элегантно и почти без лишнего кода.

📚 Подробности на Хабр: https://habr.com/ru/articles/943744/
👍3🔥31😁1
🫡 Еженедельный дайджест №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