Docker Volumes & Data Persistence
→ Контейнеры по умолчанию временные, их данные исчезают после остановки или удаления.
→ Docker даёт механизмы для постоянного хранения, чтобы данные переживали перезапуски.
→ Самый надёжный способ - использовать Docker volumes.
1. Почему важна устойчивость данных
→ Контейнеры часто пересоздаются при обновлениях и масштабировании.
→ Без персистентности пропадут логи, базы данных, загрузки пользователей, конфиги.
→ Docker volumes решают это, вынося данные за пределы файловой системы контейнера.
2. Варианты хранилищ в Docker
a) Volumes
→ Управляются Docker.
→ Хранятся в /var/lib/docker/volumes/.
→ Не зависят от контейнеров.
→ Лучший выбор для БД и долгоживущих данных.
b) Bind Mounts
→ Привязывают локальную директорию хоста к контейнеру.
→ Удобно в разработке.
→ Менее переносимые.
c) tmpfs Mounts
→ Данные только в памяти.
→ Очень быстрые, но непостоянные.
→ Для временных и чувствительных данных.
3. Что такое Docker Volume
→ Это область постоянного хранения, управляемая Docker.
→ Не удаляется при удалении контейнера.
→ Можно безопасно шарить между контейнерами.
Создать volume:
docker volume create mydata
Использовать:
Посмотреть:
4. Типы Volumes
a) Named Volumes
→ Создаются вручную.
→ Чистая изоляция от файлов системы хоста.
→ Лучший вариант для продакшена.
b) Anonymous Volumes
→ Без имени.
→ Могут удаляться вместе с контейнером.
→ Для временных задач.
5. Преимущества Docker Volumes
→ Данные переживают рестарты.
→ Легко бэкапить и переносить.
→ Работают при обновлении контейнеров.
→ Можно шарить между контейнерами.
→ Docker оптимизирует хранение под производительность.
6. Bind Mounts
→ Позволяют смонтировать директорию хоста:
→ Удобно в разработке (горячая перезагрузка кода).
→ В продакшене использовать аккуратно.
7. Persistency в Docker Compose
Compose автоматически управляет volumes.
Пример:
→ База сохраняет данные между перезапусками.
8. Бэкап и восстановление Volumes
Бэкап:
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czvf /backup/backup.tar.gz /data
Восстановление:
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar xzvf /backup/backup.tar.gz -C /
9. Как выбрать способ хранения
→ Volumes - лучший вариант для продакшена.
→ Bind mounts - для разработки.
→ tmpfs - для временных и быстрых операций.
Quick tip
→ Docker volumes - основа устойчивости данных.
→ Даёт гибкость, скорость и надёжность.
→ Незаменимы для баз данных, stateful-сервисов и реальных продакшен-приложений.```
→ Контейнеры по умолчанию временные, их данные исчезают после остановки или удаления.
→ Docker даёт механизмы для постоянного хранения, чтобы данные переживали перезапуски.
→ Самый надёжный способ - использовать Docker volumes.
1. Почему важна устойчивость данных
→ Контейнеры часто пересоздаются при обновлениях и масштабировании.
→ Без персистентности пропадут логи, базы данных, загрузки пользователей, конфиги.
→ Docker volumes решают это, вынося данные за пределы файловой системы контейнера.
2. Варианты хранилищ в Docker
a) Volumes
→ Управляются Docker.
→ Хранятся в /var/lib/docker/volumes/.
→ Не зависят от контейнеров.
→ Лучший выбор для БД и долгоживущих данных.
b) Bind Mounts
→ Привязывают локальную директорию хоста к контейнеру.
→ Удобно в разработке.
→ Менее переносимые.
c) tmpfs Mounts
→ Данные только в памяти.
→ Очень быстрые, но непостоянные.
→ Для временных и чувствительных данных.
3. Что такое Docker Volume
→ Это область постоянного хранения, управляемая Docker.
→ Не удаляется при удалении контейнера.
→ Можно безопасно шарить между контейнерами.
Создать volume:
docker volume create mydata
Использовать:
docker run -v mydata:/app/data nginx
Посмотреть:
docker volume inspect mydata4. Типы Volumes
a) Named Volumes
→ Создаются вручную.
→ Чистая изоляция от файлов системы хоста.
→ Лучший вариант для продакшена.
b) Anonymous Volumes
→ Без имени.
→ Могут удаляться вместе с контейнером.
→ Для временных задач.
5. Преимущества Docker Volumes
→ Данные переживают рестарты.
→ Легко бэкапить и переносить.
→ Работают при обновлении контейнеров.
→ Можно шарить между контейнерами.
→ Docker оптимизирует хранение под производительность.
6. Bind Mounts
→ Позволяют смонтировать директорию хоста:
docker run -v /host/path:/container/path myapp→ Удобно в разработке (горячая перезагрузка кода).
→ В продакшене использовать аккуратно.
7. Persistency в Docker Compose
Compose автоматически управляет volumes.
Пример:
services:
db:
image: postgres
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
→ База сохраняет данные между перезапусками.
8. Бэкап и восстановление Volumes
Бэкап:
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar czvf /backup/backup.tar.gz /data
Восстановление:
docker run --rm -v mydata:/data -v $(pwd):/backup alpine tar xzvf /backup/backup.tar.gz -C /
9. Как выбрать способ хранения
→ Volumes - лучший вариант для продакшена.
→ Bind mounts - для разработки.
→ tmpfs - для временных и быстрых операций.
Quick tip
→ Docker volumes - основа устойчивости данных.
→ Даёт гибкость, скорость и надёжность.
→ Незаменимы для баз данных, stateful-сервисов и реальных продакшен-приложений.```
👍11🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Что добавили:
🔹 Анализ утечек ресурсов прямо в IDE - ошибки правятся на лету
🔹 ИИ-помощники: Junie и Claude Agent помогают писать и править код
🔹 Встроенная поддержка Terraform без плагинов
🔹 Удобный мониторинг Kubernetes-процессов
Подробности — jetbrains.com/go/whatsnew/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥3🥰1
Он сканирует директории и показывает, что именно съедает место, работая особенно шустро на SSD за счёт параллельной обработки. Есть TUI-интерфейс: можно стрелками ходить по каталогам, сортировать по размеру и удалять лишнее прямо из программы.
Установка максимально простая - есть готовые бинарники на GitHub, пакеты в репозиториях (AUR, Homebrew, Snap и др.), так что поставить и проверить свои диски можно за пару минут.
https://github.com/dundee/gdu
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥1
🚀 Spreak - мощный и удобный инструмент для перевода в Go
Если вы пишете приложения на Go и хотите добавить поддержку нескольких языков - библиотека Spreak упрощает эту задачу.
🔹 Поддерживает gettext-совместимые каталоги
🔹 Работает с plural-формами и контекстом
🔹 Позволяет хранить переводы в файлах или embed'ить их в бинарь
🔹 Имеет удобный API для извлечения сообщений и форматирования
Spreak помогает избежать ручного хардкода строк, оставаясь совместимым с существующими инструментами локализации.
🔗 GitHub: https://github.com/vorlif/spreak
Если вы пишете приложения на Go и хотите добавить поддержку нескольких языков - библиотека Spreak упрощает эту задачу.
🔹 Поддерживает gettext-совместимые каталоги
🔹 Работает с plural-формами и контекстом
🔹 Позволяет хранить переводы в файлах или embed'ить их в бинарь
🔹 Имеет удобный API для извлечения сообщений и форматирования
Spreak помогает избежать ручного хардкода строк, оставаясь совместимым с существующими инструментами локализации.
🔗 GitHub: https://github.com/vorlif/spreak
👍13❤4🔥4
Это инструмент для построения сервисов и взаимодействия между ними - что-то вроде Lego для распределённых приложений: подключай блоки, соединяй компоненты и получай рабочую систему.
Подходит для экспериментов с архитектурой, интеграции сервисов и быстрых прототипов. Лаконичный код, понятная структура — можно изучать как пример реализации собственной связующей шины.
Стоит посмотреть, если интересуешься микросервисами, event-driven системами или любишь копнуть архитектурные идеи руками.
github.com/x-sushant-x/Connective
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤2👍2😁1
Лёгкие и составные примитивы для надёжных синхронных и конкурентных конвейеров в Go
rop3 - это набор простых, но мощных строительных блоков для создания устойчивых конвейеров обработки данных в Go. Библиотека основана на паттерне Railway Oriented Programming, который помогает чётко моделировать последовательные и параллельные этапы обработки с удобной обработкой ошибок.
Вместо того чтобы плести сложные цепочки
При этом поддерживается как синхронная, так и конкурентная обработка данных — всё это без тяжеловесных фреймворков и скрытой магии.
github.com/ib-77/rop3
rop3 - это набор простых, но мощных строительных блоков для создания устойчивых конвейеров обработки данных в Go. Библиотека основана на паттерне Railway Oriented Programming, который помогает чётко моделировать последовательные и параллельные этапы обработки с удобной обработкой ошибок.
Вместо того чтобы плести сложные цепочки
if err != nil, rop3 предлагает выразительные примитивы, которые легко комбинируются. Благодаря этому код становится чище и понятнее, а обработка ошибок и логика переходов перестаёт быть источником багов. При этом поддерживается как синхронная, так и конкурентная обработка данных — всё это без тяжеловесных фреймворков и скрытой магии.
github.com/ib-77/rop3
🔥3❤2👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Полезная шпаргалка по консольным командам Git 👍
В Git полно команд, и если ты часто их забываешь, эта шпаргалка специально для тебя. В репозитории можно быстро почитать об основных командах и концепциях, а затем одним вальяжным нажатием на Ctrl+C скопировать их.
Приятный бонус — всё написано на русском. Так что сохраняем!
#git #шпаргалка
В Git полно команд, и если ты часто их забываешь, эта шпаргалка специально для тебя. В репозитории можно быстро почитать об основных командах и концепциях, а затем одним вальяжным нажатием на Ctrl+C скопировать их.
Приятный бонус — всё написано на русском. Так что сохраняем!
#git #шпаргалка
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🥰3
❓ Что выведет программа?
И объясни, почему вывод - НЕ тот, который ожидает большинство 🙂
🔥 Разбор
t := s[:2] и u := s[2:] смотрят на один и тот же underlying array
но append(t, 9) может либо
• дописать в тот же массив, либо
• выделить новый, если capacity закончилась
Именно тут начинается путаница:
если capacity исходного s >= 5 — append изменит исходный массив, и s, t, u будут видеть изменения друг друга
если capacity = 4 — append создаст новый backing array, и t “оторвётся” от s и u
То есть вывод зависит от capacity, а её большинство разработчиков не проверяют, но предполагают.
✔️ Добавим интриги — сделай capacity явной 👇
s := make([]int, 4, 4) // capacity = length
copy(s, []int{1,2,3,4})
Теперь:
- append(t, 9) создаёт новый массив
и t уже не связан с s
Вывод будет:
```
s: [1 2 99 4]
t: [1 2 9]
u: [99 4]
```
Но если capacity увеличить:
```go
s := make([]int, 4, 10) // capacity > length
copy(s, []int{1,2,3,4})
```
Мы получим:
```
s: [1 2 9 99]
t: [1 2 9]
u: [99 4]
```
Потому что в этот раз append записал в тот же underlying array.
В Go поведение slice зависит от capacity --и два, казалось бы, одинаковых куска кода могут работать по-разному без единой строки изменения.
👉 Запустить код
И объясни, почему вывод - НЕ тот, который ожидает большинство 🙂
package main
import "fmt"
func main() {
s := []int{1, 2, 3, 4}
t := s[:2] // [1 2]
u := s[2:] // [3 4]
// Изменяем через t
t = append(t, 9)
// Изменяем через u
u[0] = 99
fmt.Println("s:", s)
fmt.Println("t:", t)
fmt.Println("u:", u)
}
🔥 Разбор
t := s[:2] и u := s[2:] смотрят на один и тот же underlying array
но append(t, 9) может либо
• дописать в тот же массив, либо
• выделить новый, если capacity закончилась
Именно тут начинается путаница:
если capacity исходного s >= 5 — append изменит исходный массив, и s, t, u будут видеть изменения друг друга
если capacity = 4 — append создаст новый backing array, и t “оторвётся” от s и u
То есть вывод зависит от capacity, а её большинство разработчиков не проверяют, но предполагают.
✔️ Добавим интриги — сделай capacity явной 👇
s := make([]int, 4, 4) // capacity = length
copy(s, []int{1,2,3,4})
Теперь:
- append(t, 9) создаёт новый массив
и t уже не связан с s
Вывод будет:
```
s: [1 2 99 4]
t: [1 2 9]
u: [99 4]
```
Но если capacity увеличить:
```go
s := make([]int, 4, 10) // capacity > length
copy(s, []int{1,2,3,4})
```
Мы получим:
```
s: [1 2 9 99]
t: [1 2 9]
u: [99 4]
```
Потому что в этот раз append записал в тот же underlying array.
В Go поведение slice зависит от capacity --и два, казалось бы, одинаковых куска кода могут работать по-разному без единой строки изменения.
👉 Запустить код
🥱17👍9🥴7❤5🔥4🤣3👌2
🛠️ Упрощение ошибок STL для C++
🚀Основные моменты:
- Упрощает сложные имена типов и убирает лишние детали.
- Поддерживает C++11/14/17/20.
- Интеграция с CMake и ccache.
- Настраиваемые параметры для вывода ошибок.
📌 GitHub: https://github.com/ozacod/stlfilt-go
#go
stlfilt-go — это инструмент командной строки на Go, который фильтрует и упрощает сообщения об ошибках STL из GCC/Clang, делая их более читаемыми. Он поддерживает современный C++ и предлагает подсветку синтаксиса для улучшения восприятия.🚀Основные моменты:
- Упрощает сложные имена типов и убирает лишние детали.
- Поддерживает C++11/14/17/20.
- Интеграция с CMake и ccache.
- Настраиваемые параметры для вывода ошибок.
📌 GitHub: https://github.com/ozacod/stlfilt-go
#go
👍4❤3🥰3
🚀 Go 1.26 ускоряет работу с памятью
В новом релизе Go команда сильно оптимизировала выделение памяти для малых объектов (1–512 байт).
Теперь рантайм использует специализированные версии allocator’а и таблицы переходов — чтобы быстрее подбирать нужную функцию под размер объекта, а не полагаться на одну универсальную реализацию.
📈 Что это даёт
- до 30% экономии на выделении маленьких объектов;
- примерно ~1% ускорения в реальных программах, где много аллокаций (что на масштабе — очень ощутимо).
Техническая деталь: компилятор всё ещё вызывает общий mallocgc, но на этапе выполнения он перенаправляется к новым специализированным функциям.
При необходимости поведение можно отключить флагом сборки:
GOEXPERIMENT=nosizespecializedmalloc.
Go продолжает аккуратно выжимать производительность не ломая экосистему - маленькие изменения, большой эффект.
@golang_interview
В новом релизе Go команда сильно оптимизировала выделение памяти для малых объектов (1–512 байт).
Теперь рантайм использует специализированные версии allocator’а и таблицы переходов — чтобы быстрее подбирать нужную функцию под размер объекта, а не полагаться на одну универсальную реализацию.
📈 Что это даёт
- до 30% экономии на выделении маленьких объектов;
- примерно ~1% ускорения в реальных программах, где много аллокаций (что на масштабе — очень ощутимо).
Техническая деталь: компилятор всё ещё вызывает общий mallocgc, но на этапе выполнения он перенаправляется к новым специализированным функциям.
При необходимости поведение можно отключить флагом сборки:
GOEXPERIMENT=nosizespecializedmalloc.
Go продолжает аккуратно выжимать производительность не ломая экосистему - маленькие изменения, большой эффект.
@golang_interview
❤28🔥17👍6
🔥Баги захватывают мир и только ты можешь их остановить 🔥
Прокачай суперсилу Go-кодинга, сразись с вирусами, дедлоками и гонками данных -
и стань Стражем Цифровой Вселенной.
⚡ В это текстовой игре-кветсе реальные задачи, эпичные битвы и путь от нуля до профи.
Готов спасти код или он уничтожит всё?
⚡️ Начать игру: https://uproger.com/golang-avengers-bitva-za-czifrovuyu-vselennuyu-kvest-igra-dlya-izucheniya-go/
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4❤3👍3🔥2
AWS VPC - это твоя собственная изолированная сеть в облаке.
Она работает как мини-датацентр, только без физического железа: AWS сам занимается маршрутизацией, безопасностью и масштабированием.
Изоляция VPC
→ Каждый VPC полностью отделён от других.
→ Ты задаёшь свой CIDR-диапазон.
→ Доступ извне возможен только если ты сам его откроешь.
Подсети: публичные и приватные
→ VPC разбивается на субсети в разных зонах (AZ).
→ Публичные субсети выходят в интернет через Internet Gateway.
→ Приватные — через NAT Gateway (только исходящий трафик, без входящего).
→ AWS следит за отказоустойчивостью между зонами.
Как двигается трафик
→ За маршруты отвечают Route Tables.
→ Ты прописываешь правила: интернет, peering, Transit Gateway, VPN и т.д.
→ AWS управляет всей реальной сетевой инфраструктурой — ты только настраиваешь логику.
Защита сети
→ AWS использует две прослойки:
— Security Groups — правила на уровне конкретного ресурса (EC2, RDS и т.д.).
— Network ACLs — фильтрация пакетов на уровне подсети.
→ Все правила строго применяются через виртуализованную сеть AWS.
Внешние подключения
→ Для доступа наружу AWS предлагает:
— Internet Gateway (двусторонний интернет)
— NAT Gateway (доступ из приватных подсетей)
— Egress-Only IGW (только исходящий IPv6)
→ Всё автоматически масштабируется под нагрузку.
Гибридные сети
→ Можно связать VPC с офисом/датацентром:
— Site-to-Site VPN (через интернет)
— Direct Connect (частная линия до 100 Gbps)
→ AWS обеспечивает резервирование каналов для отказоустойчивости.
Общение между сетями
→ VPC Peering — приватный канал между двумя VPC.
→ Transit Gateway — центральный хаб для десятков сетей (VPC + on-prem).
→ AWS управляет маршрутизацией и пропускной способностью автоматически.
Мониторинг
→ VPC Flow Logs — кто куда ходил.
→ CloudWatch — метрики.
→ CloudTrail — кто менял сетевые настройки.
→ Полная прозрачность для аудита, безопасности и диагностики.
AWS делает сложную сетевую архитектуру «невидимой».
Ты управляешь логикой, правилами и доступами — AWS берёт на себя всё остальное.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5
go-mysql-server - это embeddable SQL-движок, написанный на Go, который реализует протокол MySQL и позволяет выполнять SQL-запросы поверх кастомных источников данных.
Проще говоря: ты получаешь MySQL-совместимый сервер, но сам решаешь, откуда берутся данные и как они хранятся.
Что умеет go-mysql-server:
- Полная поддержка MySQL-протокола
- SELECT, JOIN, GROUP BY, subquery, CTE
- Индексы, транзакции (через движок хранения)
- Пользовательские таблицы и схемы
- Возможность подключаться обычными MySQL-клиентами
Главная фишка:
Ты можешь подключить SQL поверх чего угодно:
- in-memory структур
- файлов
- API
- event-стримов
- git-подобных хранилищ (как в Dolt)
- собственных data-engine’ов
Типичные use-cases:
- SQL-интерфейс для внутренних сервисов
- Аналитика поверх нестандартных данных
- Feature-store или metadata-store
- Встраиваемые базы в Go-приложениях
- Прокси и трансформации SQL-запросов
- Тестирование и симуляция БД
Почему это интересно:
- Не нужно поднимать полноценную БД
- SQL как универсальный интерфейс
- Полный контроль над execution engine
- Отлично подходит для data-infra и backend-сервисов
Связь с Dolt:
go-mysql-server — основа DoltDB, git-подобной SQL-базы данных. Весь опыт DoltHub по SQL-движкам и версиям данных лежит здесь.
Если ты работаешь с Go, data-platforms или хочешь дать SQL-доступ к нестандартным данным - это один из самых мощных инструментов в экосистеме.
http://github.com/dolthub/go-mysql-server
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥2
Acontext - это open-source проект, который решает одну из самых болезненных проблем AI-систем: управление контекстом, памятью и состоянием между запросами.
Проект создан командой MemoDB и нацелен на разработчиков, которые строят:
- LLM-приложения
- агентные системы
- RAG-пайплайны
- long-running AI-процессы
Что делает Acontext:
- Выносит контекст из prompt’ов в отдельный слой
- Даёт структурированную «память» вместо хаотичного текста
- Позволяет хранить, обновлять и переиспользовать контекст между вызовами модели
- Упрощает построение stateful AI-приложений
- Снижает токен-оверход и стоимость inference
Ключевая идея:
контекст — это не строка, а управляемый объект.
Почему это важно:
- prompt’ы перестают разрастаться
- поведение модели становится стабильнее
- проще отлаживать и масштабировать систему
- легче добавлять новые источники знаний
Acontext особенно полезен для:
- AI-агентов
- чатов с памятью
- multi-step reasoning
- инструментальных LLM-пайплайнов
Если ты строишь что-то сложнее одного запроса к модели — без слоя управления контекстом дальше будет только боль.
Репозиторий:
https://github.com/memodb-io/Acontext
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥4👍3
Владение Docker - навык, который отличает новичка от профи,
Сегодня почти всё разворачивается в контейнерах.
Если ты не умеешь работать с Docker, ты медленнее, зависим от чужих настроек и постоянно ловишь баги «у меня локально работает».
• как упаковывать проекты в контейнеры
• как поднимать целые системы за минуты
• как избегать типичных ошибок в продакшене
• как делать стабильные и повторяемые окружения
•в нем разобраны все возможные ошибки
Только практика и реальные кейсы от авторов Docker Академии- с нуля до уверенного уровня.
🎁 Скидка 40 процентов действует 48 часов
👉 Записывайся и сделай Docker своим настоящим рабочим инструментом.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🔥3😁2🌭1
Failsafe-go - это библиотека, которая помогает строить надежные и отказоустойчивые приложения на Go.
Идея простая: вы «оборачиваете» функции и библиотека сама решает, как реагировать на ошибки, перегрузку и тайм-ауты.
Политики можно комбинировать и гибко настраивать.
Обработка ошибок включает:
Retry - повторяет запрос, если сбой временный
Fallback - возвращает дефектный результат, если всё сломалось
Сервисы с Failsafe-go меньше ломаются, быстрее восстанавливаются и ведут себя предсказуемо даже под нагрузкой и при сбоях внешних систем.
https://github.com/failsafe-go/failsafe-go
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔13❤6🔥3👍2
usql — это интерактивный SQL-клиент, который объединяет работу с разными СУБД в одном инструменте. По ощущениям он похож на psql, но поддерживает сразу множество баз данных и не привязывает тебя к одному движку.
Главная идея usql — один клиент для всех SQL-баз.
Что умеет usql:
- Подключение к PostgreSQL, MySQL, SQLite, MSSQL, Oracle, ClickHouse, CockroachDB, MariaDB и другим СУБД
- Единый интерфейс и одинаковые команды для разных движков
- Интерактивный режим с историей команд и автодополнением
- Удобный табличный вывод результатов
- Запуск SQL-скриптов из файлов
- Гибкая настройка цветов, форматов и pager’а
Почему это удобно:
- Не нужно держать десяток разных клиентов
- Не нужно переключать мышление между psql, mysql и sqlcmd
- Один привычный REPL для аналитики и администрирования
- Отлично подходит для работы сразу с несколькими базами
Кому особенно полезен usql:
- backend-разработчикам
- аналитикам данных
- DevOps-инженерам
- всем, кто регулярно работает с разными СУБД
Если ты живёшь в терминале и часто общаешься с SQL-базами, usql быстро становится инструментом по умолчанию.
github.com/xo/usql/
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5❤3👍1🔥1
В Go 1.26 много крупных оптимизаций,
но одна из самых приятных — маленькая и очень практичная:
ускорили `fmt.Errorf`.
Раньше:
- errors.New("x") и fmt.Errorf("x") создавали один и тот же тип ошибки
- но fmt.Errorf был в 3 раза медленнее
Разработчики Go устали слушать «`fmt.Errorf` медленный»
и сделали быстрый путь: если форматирования нет, код просто вызывает errors.New (см. на скрине).
Теперь:
- fmt.Errorf("x") — одна аллокация
- всего ~20% медленнее: 25ns vs 21ns
- можно спокойно использовать fmt.Errorf «по умолчанию»
Мелочь, но приятно. ✔
https://go-review.googlesource.com/c/go/+/708836
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍8🔥4😁2🌚1