🌍 Как превратить SQL в полноценный API прямо в Go?
В новой статье делимся информацией о том, как можно безопасно принимать
Просто, элегантно и почти без лишнего кода.
📚 Подробности на Хабр: https://habr.com/ru/articles/943744/
В новой статье делимся информацией о том, как можно безопасно принимать
WHERE-условия в виде SQL-подзапросов, валидировать их и использовать для запросов к базе. Просто, элегантно и почти без лишнего кода.
📚 Подробности на Хабр: https://habr.com/ru/articles/943744/
👍3🔥3❤1😁1
Forwarded from AI for Devs
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👍3🔥2
🫡 Еженедельный дайджест №1
Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!
– Generic интерфейсы в Go: просто, но сложно
– Что нового в GoLand 2025.2?
– Как проверить время и асинхронный код в Go?
– Вышли минорные релизы Go — 1.25.1 и 1.24.7
– Оптимизация памяти в Go: 20 приёмов для эффективных приложений
– Как превратить SQL в полноценный API прямо в Go?
Самый популярный комментарий этой недели – комментарий к статье "Generic интерфейсы в Go: просто, но сложно" от пользователя
@go_for_devs
Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!
– Generic интерфейсы в Go: просто, но сложно
– Что нового в GoLand 2025.2?
– Как проверить время и асинхронный код в Go?
– Вышли минорные релизы Go — 1.25.1 и 1.24.7
– Оптимизация памяти в Go: 20 приёмов для эффективных приложений
– Как превратить SQL в полноценный API прямо в Go?
Самый популярный комментарий этой недели – комментарий к статье "Generic интерфейсы в Go: просто, но сложно" от пользователя
@AuToMaton:А в старое время это делалось иначе. Никто никаких паттернов не обсуждал и не придумывал, все делали по простому. А когда замечали что делают одно и то же трижды, смотрели на написанное и устраняли дублирование.
@go_for_devs
👍4❤3🔥3
🔥 Как мы выследили регрессию использования памяти в продакшен-сервисах на Go 1.24
Команда Go for Devs подготовила перевод статьи о том, как команда инженеров выявила регрессию использования памяти в Go 1.24.
Оказалось, что всего одна оптимизация в аллокаторе памяти, случайно потерянная при рефакторинге, заставляла Go «съедать» сотни мегабайт RAM.
Но сообщество Go-разработчиков быстро нашло и устранило проблему 🫡
📚 Подробности на Хабр: https://habr.com/ru/articles/944718/
Команда Go for Devs подготовила перевод статьи о том, как команда инженеров выявила регрессию использования памяти в Go 1.24.
Оказалось, что всего одна оптимизация в аллокаторе памяти, случайно потерянная при рефакторинге, заставляла Go «съедать» сотни мегабайт RAM.
📚 Подробности на Хабр: https://habr.com/ru/articles/944718/
👍4❤2🔥2
🤷 Зачем в Go интерфейсы требуют точного совпадения?
В Go компилятор иногда автоматически преобразовывает значение тика к указателю на этот тип. Если вызвать метод с pointer-receiver на значении, всё будет работать:
Но стоит подключить интерфейсы — и магия исчезает:
Почему так?
У
Копия:
* неадресуемая,
* неизменяемая.
Если бы мы могли взять
Итог
* Интерфейсы всегда копируют значение.
* Копия не имеет адреса и не может изменяться.
* Поэтому Go не делает auto-addressing, и method set интерфейса и method set конкретного значения должны строго совпадать.
В 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
Даже если вы давно пишете 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 сам переключает вас на середину между "плохим" и "хорошим" кодом и говорит: «проверь».
Вы смотрите: баг есть →
И так несколько раз, пока Git не ткнёт пальцем в конкретный коммит: вот тут всё сломалось.
Фишка в том, что даже если между good и bad 100 коммитов, руками проверять придётся не сто, а всего 6–7. Логарифмы в действии 🙂
А если повезло, и баг можно проверить скриптом (например, тест падает с кодом 1) — вообще красота:
Git сам пройдётся по истории и принесёт виновника на блюдечке.
Так что если в следующий раз придётся охотиться за багом — не спешите листать
Вы когда-нибудь ловили баг в проекте, который «ещё вчера работал»?
Коммитов — целая гора, глазами не найти. Тут и выручает 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
Спустя почти 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🔥4❤2
🔧 Целостность данных JSON-колонок в PostgreSQL
JSON всё чаще используют в реляционных базах данных — он позволяет хранить гибкие структуры и избавляет от избыточных связей между таблицами. Но вместе с удобством появляется риск: данные могут потерять предсказуемость.
Если не контролировать содержимое JSON-колонок, туда легко попадут неожиданные значения: числа вместо строк, объекты вместо массивов. В итоге приложение может «сломаться» на ровном месте.
В MySQL проверка JSON поддерживается из коробки. В PostgreSQL для этого есть расширение, которое позволяет валидировать данные по JSON-схеме прямо на уровне БД.
Пример: у нас есть таблица
Мы ожидаем, что поле
Чтобы сохранить гибкость JSON и одновременно обеспечить строгую структуру данных, можно использовать валидацию 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
🔥6❤5👍4
🪲 За пределами отладчика: полное руководство по отладке Go-приложений
В новой статье рассказываем о том, что баги бывают разными: воспроизводимые, случайные, гейзенбаги и конкурентные.
А в арсенале Go-разработчика должны быть — TDD, стратегическое логирование, Delve, git bisect и даже онлайн-отладчик GoTutor.
📚 Подробности на Хабр: https://habr.com/ru/articles/944732/
В новой статье рассказываем о том, что баги бывают разными: воспроизводимые, случайные, гейзенбаги и конкурентные.
А в арсенале Go-разработчика должны быть — TDD, стратегическое логирование, Delve, git bisect и даже онлайн-отладчик GoTutor.
📚 Подробности на Хабр: https://habr.com/ru/articles/944732/
👍4❤2🔥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. Его влияние чувствуется не только в языке, но и в самой культуре разработки — от подхода к простоте кода до принципов открытого сообщества.
Команда 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
Команда 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%
Нет, и никогда не буду
👍3❤1
Forwarded from AI for Devs
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
😁3👍2