📦 Как оптимизировать struct в Go: выравнивание, паддинг и порядок полей
Когда ты работаешь с Go и структурой данных (`struct`), порядок полей — это не просто эстетика. Это напрямую влияет на:
• размер занимаемой памяти
• эффективность использования кэша
• и в итоге — на производительность твоей программы.
Автор [buarki на DEV.to](https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1) показывает, как правильно выстраивать поля в структурах, чтобы избежать лишнего паддинга и сделать struct более компактным и быстрым.
🔍 Что такое padding?
Go автоматически выравнивает поля структур по их размеру. Например:
Кажется, что struct должен занимать 10 байт. Но из-за выравнивания Go вставит паддинг, и итоговый размер окажется 24 байта.
✅ Как это исправить?
Меняем порядок полей:
Теперь структура занимает 16 байт, а не 24 — и всё благодаря грамотному размещению полей.
📌 Рекомендации:
• Сортируй поля от самых крупных к самым мелким
• Группируй однотипные поля
• Избегай перемешивания
• Используй визуализацию (например, viztruct) для анализа struct'ов
• Проверяй размер struct через
🎯 Это особенно важно при:
• массовом использовании struct в массивах и слайсах
• передаче struct между потоками
• работе с бинарными протоколами или mmap
📖 Подробнее с примерами: https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1
Когда ты работаешь с Go и структурой данных (`struct`), порядок полей — это не просто эстетика. Это напрямую влияет на:
• размер занимаемой памяти
• эффективность использования кэша
• и в итоге — на производительность твоей программы.
Автор [buarki на DEV.to](https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1) показывает, как правильно выстраивать поля в структурах, чтобы избежать лишнего паддинга и сделать struct более компактным и быстрым.
🔍 Что такое padding?
Go автоматически выравнивает поля структур по их размеру. Например:
type Bad struct {
a bool // 1 байт
b int64 // 8 байт
c bool // 1 байт
}
Кажется, что struct должен занимать 10 байт. Но из-за выравнивания Go вставит паддинг, и итоговый размер окажется 24 байта.
✅ Как это исправить?
Меняем порядок полей:
type Good struct {
b int64 // 8 байт
a bool // 1 байт
c bool // 1 байт
}
Теперь структура занимает 16 байт, а не 24 — и всё благодаря грамотному размещению полей.
📌 Рекомендации:
• Сортируй поля от самых крупных к самым мелким
• Группируй однотипные поля
• Избегай перемешивания
bool`/`byte
с int64`/`float64
• Используй визуализацию (например, viztruct) для анализа struct'ов
• Проверяй размер struct через
unsafe.Sizeof()
🎯 Это особенно важно при:
• массовом использовании struct в массивах и слайсах
• передаче struct между потоками
• работе с бинарными протоколами или mmap
📖 Подробнее с примерами: https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1
В статье рассматривается, как реализовать механизм "сердцебиения" (heartbeat) для горутин в Go, чтобы отслеживать их активность и своевременно обнаруживать сбои.
🔍 Зачем нужны heartbeats?
Иногда горутина может завершиться неожиданно без явных ошибок или логов, что затрудняет диагностику. Механизм heartbeats позволяет периодически отправлять сигналы о том, что горутина все еще работает, даже если она ожидает задания. Это особенно полезно для:
Мониторинга состояния фоновых задач
Обнаружения и перезапуска "зависших" горутин
Улучшения надежности и отказоустойчивости систем
🛠 Как это реализовать?
Используя time.Ticker, можно настроить горутину на периодическую отправку сигналов активности через канал. Пример функции dowork:
func dowork(done <-chan interface{}, pulseInterval time.Duration) (<-chan interface{}, <-chan struct{}) {
heartbeater := make(chan interface{})
result := make(chan struct{})
go func() {
defer close(result)
defer close(heartbeater)
pulse := time.NewTicker(pulseInterval)
workGen := time.NewTicker(3 * pulseInterval)
defer pulse.Stop()
defer workGen.Stop()
sendPulse := func() {
select {
case heartbeater <- struct{}{}:
default:
// если никто не слушает, пропускаем
}
}
sendResult := func(res struct{}) {
for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case result <- res:
return
}
}
}
for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case <-workGen.C:
sendResult(struct{}{})
}
}
}()
return heartbeater, result
}
🧪 А в main можно следить за этим:
for {
select {
case <-heartbeat:
log.Println("Still alive")
case <-time.After(5 * time.Second):
log.Println("Timeout! Goroutine might be dead")
}
}
}()
🎯 Зачем это нужно:
• Обнаружение зависших/умерших горутин
• Реализация watchdog'ов
• Надежность фоновых процессов в проде
🔗 Статья: https://blog.devgenius.io/how-to-build-heartbeats-in-go-let-your-goroutines-say-still-breathing-d047253d5c78
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
ХОЧЕШЬ ПОВЫСИТЬ ГРЕЙД В 2025 ГОДУ? 🚀
Если:
— код разваливается от правок,
— бизнес-логика размазана,
— Entity — просто структуры,
— а тесты живут своей жизнью —
вам точно сюда.
📦 Вы создадите сервис с нуля, разберете ключевые паттерны DDD и научитесь строить архитектуру, устойчивую к изменениям.
🔹 Как проходит обучение?
✅ Практика на реальном кейсе
Вы разработаете сервис диспетчеризации заказов, решая реальные бизнес-задачи.
✅ Видеоуроки в удобное время
Эксперт шаг за шагом создаст микросервис «Корзина», раскрывая ключевые паттерны DDD.
✅ Чат с экспертом
Не останетесь без ответов – задавайте вопросы в закрытом чате и получайте разбор сложных тем.
✅ Персональная обратная связь
Куратор проведет ревью кода, даст рекомендации и поможет разобраться с архитектурными решениями.
✅ Вебинары с разбором ДЗ
Эксперт ответит на вопросы, объяснит сложные темы и поможет глубже понять материал.
Программа курса включает:
🔸 Разбор всех паттернов DDD
🔸 Value Object, Entity, Aggregate, Domain Service
🔸 Repository, Application Layer, HTTP/gRPC адаптеры
🔸 Kafka: входящие и исходящие адаптеры
🔸 Eventual Consistency, Outbox, Polling Publisher
📢 Записывайтесь сейчас и станьте экспертом в DDD и Clean Architecture на Go! 👉 https://microarch.ru/courses/ddd/languages/go?utm_source=posev&utm_medium=erid:2VtzqvFWyBX&utm_campaign=4
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqvFWyBX
Если:
— код разваливается от правок,
— бизнес-логика размазана,
— Entity — просто структуры,
— а тесты живут своей жизнью —
вам точно сюда.
📦 Вы создадите сервис с нуля, разберете ключевые паттерны DDD и научитесь строить архитектуру, устойчивую к изменениям.
🔹 Как проходит обучение?
✅ Практика на реальном кейсе
Вы разработаете сервис диспетчеризации заказов, решая реальные бизнес-задачи.
✅ Видеоуроки в удобное время
Эксперт шаг за шагом создаст микросервис «Корзина», раскрывая ключевые паттерны DDD.
✅ Чат с экспертом
Не останетесь без ответов – задавайте вопросы в закрытом чате и получайте разбор сложных тем.
✅ Персональная обратная связь
Куратор проведет ревью кода, даст рекомендации и поможет разобраться с архитектурными решениями.
✅ Вебинары с разбором ДЗ
Эксперт ответит на вопросы, объяснит сложные темы и поможет глубже понять материал.
Программа курса включает:
🔸 Разбор всех паттернов DDD
🔸 Value Object, Entity, Aggregate, Domain Service
🔸 Repository, Application Layer, HTTP/gRPC адаптеры
🔸 Kafka: входящие и исходящие адаптеры
🔸 Eventual Consistency, Outbox, Polling Publisher
📢 Записывайтесь сейчас и станьте экспертом в DDD и Clean Architecture на Go! 👉 https://microarch.ru/courses/ddd/languages/go?utm_source=posev&utm_medium=erid:2VtzqvFWyBX&utm_campaign=4
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqvFWyBX
🗃️ Stoolap — лёгкая и быстрая SQL-база данных на чистом Go без зависимостей
Stoolap — это современный HTAP-движок (Hybrid Transactional/Analytical Processing), сочетающий OLTP и OLAP в одном ядре. Подходит как для транзакционных задач, так и для аналитики.
🚀 Возможности:
• Полностью написан на Go — никаких внешних зависимостей
• ACID-транзакции через MVCC
• Колонковое хранение с SIMD-ускорением
• Поддержка SQL: JOIN, агрегаты, оконные функции
• Встроенный тип JSON
• Поддержка
• CLI-режим и in-memory база
📦 Установка:
🔥 Быстрый старт (CLI):
📎 Репозиторий: https://github.com/stoolap/stoolap
🌐 Сайт: https://stoolap.io
@golang_google
Stoolap — это современный HTAP-движок (Hybrid Transactional/Analytical Processing), сочетающий OLTP и OLAP в одном ядре. Подходит как для транзакционных задач, так и для аналитики.
🚀 Возможности:
• Полностью написан на Go — никаких внешних зависимостей
• ACID-транзакции через MVCC
• Колонковое хранение с SIMD-ускорением
• Поддержка SQL: JOIN, агрегаты, оконные функции
• Встроенный тип JSON
• Поддержка
database/sql
и интеграция с GORM • CLI-режим и in-memory база
📦 Установка:
go get github.com/stoolap/stoolap
🔥 Быстрый старт (CLI):
stoolap -db memory://
📎 Репозиторий: https://github.com/stoolap/stoolap
🌐 Сайт: https://stoolap.io
@golang_google
🏗️ Как строить масштабируемые multi-tenant приложения на Go — опыт Atlas Cloud
В этой статье команда Atlas делится практическими стратегиями масштабирования multi-tenant приложений на Go, основанными на опыте разработки бэкенда для Atlas Cloud — части их коммерческого продукта.
🔍 Что такое multi-tenancy?
Multi-tenancy — это архитектура, при которой один инстанс системы обслуживает сразу нескольких клиентов (арендаторов).
📦 Но тут важен нюанс: клиенты ожидают, что сервис будет работать так, как будто он только для них — без потерь в скорости, надёжности и безопасности.
Именно поэтому вы *молча* обещаете каждому клиенту две вещи:
1. Изоляция данных — никакой арендатор не должен иметь доступ к чужим данным
2. Стабильная производительность — нагрузка одного арендатора не должна замедлять других
🛡️ Стратегия №1 — Физическая изоляция (Dedicated Instances)
Самый прямой способ выполнить эти обещания — запуск отдельного инстанса приложения на каждого арендатора.
Что это даёт:
✅ Данные арендаторов хранятся в отдельных БД (или даже в разных VPC/облаках)
✅ Полная изоляция ресурсов — никто не шумит и не мешает
✅ Безопасность на уровне инфраструктуры
💸 Но у такого подхода есть и минусы:
• Сложность в управлении: сотни и тысячи развёрнутых инстансов, каждая со своей БД и конфигурацией
• Стоимость: каждый инстанс потребляет ресурсы, и это дорого
• Проблемы масштабирования: каждый новый клиент = новый деплой
• Сложности с наблюдаемостью: логи, метрики и дебаг — теперь распределены по куче окружений
В статье авторы разбирают гибридные подходы, модели хранения, обработку миграций и советы по коду.
🔗 Продолжение читай тут:
https://atlasgo.io/blog/2025/05/26/gophercon-scalable-multi-tenant-apps-in-go
@golang_google
В этой статье команда Atlas делится практическими стратегиями масштабирования multi-tenant приложений на Go, основанными на опыте разработки бэкенда для Atlas Cloud — части их коммерческого продукта.
🔍 Что такое multi-tenancy?
Multi-tenancy — это архитектура, при которой один инстанс системы обслуживает сразу нескольких клиентов (арендаторов).
📦 Но тут важен нюанс: клиенты ожидают, что сервис будет работать так, как будто он только для них — без потерь в скорости, надёжности и безопасности.
Именно поэтому вы *молча* обещаете каждому клиенту две вещи:
1. Изоляция данных — никакой арендатор не должен иметь доступ к чужим данным
2. Стабильная производительность — нагрузка одного арендатора не должна замедлять других
🛡️ Стратегия №1 — Физическая изоляция (Dedicated Instances)
Самый прямой способ выполнить эти обещания — запуск отдельного инстанса приложения на каждого арендатора.
Что это даёт:
✅ Данные арендаторов хранятся в отдельных БД (или даже в разных VPC/облаках)
✅ Полная изоляция ресурсов — никто не шумит и не мешает
✅ Безопасность на уровне инфраструктуры
💸 Но у такого подхода есть и минусы:
• Сложность в управлении: сотни и тысячи развёрнутых инстансов, каждая со своей БД и конфигурацией
• Стоимость: каждый инстанс потребляет ресурсы, и это дорого
• Проблемы масштабирования: каждый новый клиент = новый деплой
• Сложности с наблюдаемостью: логи, метрики и дебаг — теперь распределены по куче окружений
В статье авторы разбирают гибридные подходы, модели хранения, обработку миграций и советы по коду.
🔗 Продолжение читай тут:
https://atlasgo.io/blog/2025/05/26/gophercon-scalable-multi-tenant-apps-in-go
@golang_google
📦 godump — удобный Go-инструмент для дампа объектов в читаемом виде
Инструмент помогает красиво и наглядно выводить внутреннее содержимое структур, карт, срезов и других объектов.
🛠️ Что умеет godump:
• Красиво форматирует вложенные структуры и срезы
• Поддерживает карты, интерфейсы, указатели, циклы
• Вывод в цвете (ANSI) и с отступами
• Умеет обходить циклические ссылки
• Простой API:
💡 Отлично подходит для:
- Отладки и логирования сложных структур
- Инспекции JSON-данных после анмаршалинга
- Быстрой визуальной проверки содержимого без IDE
🔍 Пример использования:
🚀 Установка:
🔗 https://github.com/goforj/godump
Если
@golang_google
godump
— это мощная альтернатива fmt.Printf("%#v")
и spew.Dump
для Go-разработчиков. Инструмент помогает красиво и наглядно выводить внутреннее содержимое структур, карт, срезов и других объектов.
🛠️ Что умеет godump:
• Красиво форматирует вложенные структуры и срезы
• Поддерживает карты, интерфейсы, указатели, циклы
• Вывод в цвете (ANSI) и с отступами
• Умеет обходить циклические ссылки
• Простой API:
godump.Dump(anyObject)
💡 Отлично подходит для:
- Отладки и логирования сложных структур
- Инспекции JSON-данных после анмаршалинга
- Быстрой визуальной проверки содержимого без IDE
🔍 Пример использования:
import "github.com/goforj/godump"
type User struct {
Name string
Tags []string
}
func main() {
user := User{"Alice", []string{"dev", "golang"}}
godump.Dump(user)
}
🚀 Установка:
go get github.com/goforj/godump
🔗 https://github.com/goforj/godump
Если
fmt.Println
уже не справляется — попробуй godump
. Красиво. Быстро. Глубоко.@golang_google
Это современный, сверхпроизводительный, специально разработанный API-шлюз с открытым исходным кодом.
Tyk Operator предоставляет возможности полного жизненного цикла управления API в Kubernetes. Вы можете настраивать Ingress, API, политики безопасности, аутентификацию, авторизацию, посредничество, используя лучшие практики GitOps с помощью пользовательских ресурсов и примитивов, присущих Kubernetes.
📌 Github
#golang #devops #девопс
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Давно хотели освоить программирование, но вас останавливала нехватка времени или строгие дедлайны? Тогда советуем обратить внимание на бесплатные курсы Яндекс Лицея по Python, Go и C++ для начинающих.
Заниматься на них можно когда и где угодно, ведь уроки доступны онлайн и в них нет дедлайнов! Вас ждут:
✅ Качество: занятия разработаны практикующими экспертами Яндекса.
✅ Свобода: пользуйтесь автоматической проверкой решений и задавайте вопросы через поддержку.
✅ Перспективы: после завершения вы получите уверенную базу для дальнейшего роста, а также сертификат, который пригодится при поступлении в Яндекс Лицей.
Не откладывайте на потом — выберите курс и зарегистрируйтесь на сайте!
Заниматься на них можно когда и где угодно, ведь уроки доступны онлайн и в них нет дедлайнов! Вас ждут:
✅ Качество: занятия разработаны практикующими экспертами Яндекса.
✅ Свобода: пользуйтесь автоматической проверкой решений и задавайте вопросы через поддержку.
✅ Перспективы: после завершения вы получите уверенную базу для дальнейшего роста, а также сертификат, который пригодится при поступлении в Яндекс Лицей.
Не откладывайте на потом — выберите курс и зарегистрируйтесь на сайте!
Тысячи бессонных ночей сотен ресёрчеров и ML-инженеров дали миру сначала большие языковые модели, а потом MCP-протокол - открытый стандарт, который связал эти модели и дал возможность подключаться к приложениям, системам и API.
Они мечтали о будущем, где ИИ будет решать климатические кризисы, расшифровывать геном, найдет решение глобальных проблем или, в крайнем случае, будет писать вам стихи и поэмы.
Как это используют люди? Пилят действительно важные и нужные интеграции.
Проект поддерживает Ollama, подключение к экосистеме управления умным домом HomeAssistant MCP и написан на Go.
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Проект, который превращает терминал в многопоточную машину для работы с LLM-агентами: Claude, GPT, Aider, Codex и другими.
🧠 Что делает Uzi:
• Запускает несколько агентов параллельно
• Каждому агенту — свой
git worktree
, tmux
и порт • Можно задавать общую задачу, а агенты предложат решения независимо
• Позволяет наблюдать за прогрессом, подтверждать или отклонять шаги
• Упрощает слияние финальных изменений — без ручной рутины
🛠 Пример:
uzi prompt --agents claude:2,gpt4:1 "Добавь в проект GraphQL API и авторизацию"
Затем:
-
uzi auto
— агентам можно доверить автоматические действия -
uzi broadcast "Обнови документацию"
— отправить команду всем -
uzi checkpoint
— сохранить и закоммитить результат🧪 Идеально подходит для:
— Быстрой генерации MVP
— Прототипирования фичей сразу в нескольких вариантах
— Параллельной работы с кодовыми ассистентами
— Демонстраций, где хочется "показать мощь LLM сразу в действии"
📦 Установка:
go install github.com/devflowinc/uzi@latest
📌 Репозиторий
#AI #DevTools #CLI #LLM #CodeGeneration #OpenSource
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Доступен первый альфа-выпуск языка программирования Gauntlet, надстройки над языком Go, решающей некоторые архитектурные проблемы и добавляющей дополнительную функциональность.
Программы на языке Gauntlet поддерживают все возможности языка Go, транслируются в представление на языке Go и интегрируются с существующей экосистемой Go без необходимости задействования обвязок (binding).
Развиваемый проектом инструментарий написан на языке F# и распространяется пол лицензией GPLv3. Для работы с кодом предоставляется дополнение к редактору VSCode.
Решаемые в Gauntlet проблемы:
• Назойливый вывод ошибок, связанных с неиспользуемыми переменными (Gauntlet добавляет для всех неиспользуемых переменных заглушки вида "_ = a").
• Раздутый код для обработки ошибок. В Gauntlet вместо условных блоков вида "if err != nil" используются однострочные выражения "try-with".
• Назойливый способ импорта и экспорта (например, в Go необходимо, чтобы экспортируемые имена начинались на заглавную букву).
• Отсутствие тенарного оператора. В Gauntlet можно использовать выражения вида 'let properWord = @String len(lines) > 1 ? "lines" : "line"'.
•Отсутствие синтаксиса switch-case.
• Усложнённые циклы "for". В Gauntlet можно писать "for let _, c in "Hello" {" вместо "for _, c := range "Hello" {".
• Необычный оператор присваивания (":=" для одновременного объявления и инициализации переменных; "=" для изменения значения уже объявленных переменных).
• Невозможность вызова функций по цепочке (в Gauntlet поддерживается вызов вида 'let trimmedLines = fileContentStrVersion => strings.trimSpace(_) => strings.split(_, "\n")'.
Расширенные возможности Gauntlet:
• Синтаксис "when-is" похожий на switch.case, но манипулирующий выражениями.
• Поддержка pipe-каналов, позволяющих по цепочке пропускать значение через несколько выражений или функций. например "10 => add(_, 10) => add(_, 30) => divide(_, 2)".
• Выражения "try .. with" и "force .. with".
• Выражение "wrapper" для создания псевдонимов типов (например. "wrapper Int Dollars").
#Gauntlet #golang
@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно ли за 4 года стать хорошим фулстек-разработчиком с дипломом престижного вуза,
готовым портфолио и сильной теоретической базой?💻
В совместном онлайн-бакалавриате НИУ ВШЭ и Нетологии «Программные системы и автоматизация процессов разработки»
готовят как раз таких специалистов.🔥
На первых курсах вы изучите базовые математические и гуманитарные предметы,
основы программирования и профильные дисциплины по фулстек-разработке.
А с третьего курса выберете углублённый трек: руководитель командой разработки или DevOps-инженер.
По итогу обучения освоите 4 языка программирования: Java, Python, JavaScript, Go.
Вас ждёт:
📎 сильное студенческое комьюнити,
📎 постоянная практика,
📎 хакатоны и стажировки.
🙂 А ещё — все бонусы очной формы обучения: отсрочка от армии, льготы на проезд,
доступ к библиотеке, привилегии при посещении театров, льготный кредит на
образование.
Получите диплом, который поможет строить карьеру в сильных IT-командах.
Подробнее➡️ https://netolo.gy/ebKa
Реклама. ООО "Нетология". ИНН 7726464125 Erid: 2VSb5z1PXD2
готовым портфолио и сильной теоретической базой?
В совместном онлайн-бакалавриате НИУ ВШЭ и Нетологии «Программные системы и автоматизация процессов разработки»
готовят как раз таких специалистов.
На первых курсах вы изучите базовые математические и гуманитарные предметы,
основы программирования и профильные дисциплины по фулстек-разработке.
А с третьего курса выберете углублённый трек: руководитель командой разработки или DevOps-инженер.
По итогу обучения освоите 4 языка программирования: Java, Python, JavaScript, Go.
Вас ждёт:
доступ к библиотеке, привилегии при посещении театров, льготный кредит на
образование.
Получите диплом, который поможет строить карьеру в сильных IT-командах.
Подробнее
Реклама. ООО "Нетология". ИНН 7726464125 Erid: 2VSb5z1PXD2
Please open Telegram to view this post
VIEW IN TELEGRAM
📡 apimocker — простой мокер REST API без бэкенда
apimocker — это легкий TUI-инструмент на Go, который поднимает фейковый API из YAML/JSON за секунды. Идеален для фронтенда, тестов и прототипов.
🛠 Что умеет:
• Динамичные JSON-ответы с шаблонами (
• Задержки, ошибки с вероятностью
• Отдача файлов (изображений и др.)
• Логирование (plain/json)
• TUI-интерфейс с активными маршрутами
💡 Подходит для:
• Быстрого мокинга
• Демонстраций и тестов
• Изоляции от реального API
🚀 Установка:
🔗 https://github.com/Hanashiko/apimocker
Нужен API-сервер без сервера? Используй apimocker.
@golang_google
apimocker — это легкий TUI-инструмент на Go, который поднимает фейковый API из YAML/JSON за секунды. Идеален для фронтенда, тестов и прототипов.
🛠 Что умеет:
• Динамичные JSON-ответы с шаблонами (
"id": "uuid"
, "email": "email"
)• Задержки, ошибки с вероятностью
• Отдача файлов (изображений и др.)
• Логирование (plain/json)
• TUI-интерфейс с активными маршрутами
💡 Подходит для:
• Быстрого мокинга
• Демонстраций и тестов
• Изоляции от реального API
🚀 Установка:
yay -S apimocker # Arch
# или:
git clone https://github.com/Hanashiko/apimocker.git
cd apimocker && go build -o apimocker main.go
sudo mv apimocker /usr/bin/
🔗 https://github.com/Hanashiko/apimocker
Нужен API-сервер без сервера? Используй apimocker.
@golang_google