-
Если синглтон не был правильно реализован с учётом многозадачности, могут возникнуть гонки данных, когда несколько горутин одновременно пытаются создать или получить доступ к экземпляру синглтона.
-
Если приложение становится более сложным и распределённым, синглтон может стать ограничением для масштабируемости. В распределённых системах или микросервисах использование синглтонов может привести к проблемам с состоянием и затруднить масштабирование приложения.
-
Синглтон может стать узким местом в многозадачных приложениях, особенно если доступ к нему синхронизирован с использованием блокировок, таких как мьютексы. Если горутины часто обращаются к синглтону и блокируют его, это может существенно снизить производительность программы.
-
Если синглтон требует сложной инициализации, например, создание нескольких объектов, настройка зависимостей, это может замедлить работу приложения, особенно если инициализация не оптимизирована.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🥱2
init() запускается при OnceValue — ленивая инициализация: вычисление происходит только при Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
✅
Создание нового соединения это дорогостоящая операция. Синглтон гарантирует, что во всём приложении используется один общий пул соединений
(*sql.DB), что снижает накладные расходы и предотвращает исчерпание лимитов на стороне базы данных.✅
Параметры приложения: файл конфигурации, переменные окружения. Они читаются один раз при старте. Синглтон даёт удобный единый доступ к этим данным из любой части программы без повторного чтения и парсинга.
✅
Глобальный логгер: он должен быть один, настроен единожды (уровень логирования, вывод, формат) и доступен из любого пакета. В Go это часто реализуется через log/slog или сторонние библиотеки вроде zap.
✅
Если приложению нужен разделяемый кэш (например, результаты тяжёлых вычислений или ответы внешних API), синглтон обеспечивает единое хранилище для всех горутин. Важно сочетать его с sync.RWMutex или использовать sync.Map для безопасного доступа.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
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 места на курс по ИИ-агентам. 30 апреля закрываем набор окончательно.
В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.
🏃♀️ Записаться, пока есть места
В ГС честно рассказали:
— Кому курс не подойдет;
— Какой хардкор в программе (LangGraph, AutoGen, CrewAI);
— Как мы даем токены, чтобы вы не тратили свои деньги.
Please open Telegram to view this post
VIEW IN TELEGRAM
Это фундаментальное требование грамматики языка, обусловленное работой
В Go лексер автоматически вставляет
• идентификатор:
foo, x, myVar• литерал:
42, "hello", true•
break, continue, fallthrough, return, ++, --, ), ], }Это означает, что код вида:
func foo()
{
}
лексер преобразует в:
func foo(); // ← `;` вставлена после `)`
{
}
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥6
Makefile это файл с описанием
В Go-проектах он используется для автоматизации
Вместо того чтобы каждый раз вручную запускать
go fmt, go vet и go build, достаточно одной команды make и все шаги выполнятся в нужном порядке.Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Вместо того чтобы перечислять значения, достаточно указать только значимые позиции.
Нужно в литерале массив указать индекс элемента явно через
индекс: значение. Все значения, что не будут указаны заполнятся дефолтными значениями.Пример:
var x = [12]int{1, 5: 4, 6, 10: 100, 15}Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2
Если несколько горутин читают и пишут в один слайс
append может вызвать
Передача слайса по значению копирует только
Что делать:
•
sync.Mutex / sync.RWMutex — если нужен общий • передавать копию данных через канал, если горутина должна работать независимо
• sync.Map или разбиение на независимые диапазоны, если горутины работают с непересекающимися частями
Важный нюанс: если горутины работают со строго непересекающимися индексами и append не вызывается — гонки нет. Но доказать это на ревью сложно, поэтому явная синхронизация предпочтительнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
%v от %#v в fmt.Printf%v — выводит значение в формате%#v — выводит значение в type User struct {
Name string
Age int
}
u := User{"Alice", 30}
fmt.Printf("%v\n", u) // {Alice 30}
fmt.Printf("%#v\n", u) // main.User{Name:"Alice", Age:30}Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Go обращается
Доступ к элементу слайса константный по времени О(1).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
require фиксирует модуль и его версию. Без этой записи Go не знает, что подключать. При запуске go mod tidy строки require обновляются автоматически.require github.com/some/pkg v1.2.3
replace подменяет источник модуля. Можно указать форк, другую версию или локальный путь. Чаще всего используют при локальной разработке — когда нужно протестировать изменения в зависимости, не публикуя их. replace github.com/some/pkg => ../local/pkg
exclude запрещает использовать конкретную версию при разрешении зависимостей. Модуль не удаляется, но если что-то в дереве зависимостей попытается подтянуть именно эту версию — Go её проигнорирует и выберет другую. Применяют, когда версия содержит баг или уязвимость.exclude github.com/some/pkg v1.2.3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
В Go нет встроенного ограничения на размер бинарника. Теоретический предел это ресурсы машины, на которой идёт компиляция: свободное место на диске и доступная память.
Размер бинарника растёт из-за нескольких вещей:
Статическая линковка. Go по умолчанию собирает всё в один файл — рантайм, стандартная библиотека, все зависимости. Никаких внешних
.so или .dll. Это удобно при деплое, но увеличивает размер даже у простой программы.Встроенные ресурсы. Через
//go:embed можно упаковать в бинарник статику, шаблоны, миграции. Добавили папку с фронтендом — бинарник вырос на её размер.Отладочная информация. По умолчанию Go включает в бинарник DWARF-символы и таблицы имён. Это нужно для профилировщика и стектрейсов, но добавляет вес.
Если размер важен, его можно уменьшить флагами линковщика:
go build -ldflags="-s -w" -o app .
-s убирает таблицу символов, -w отключает DWARF. Бинарник становится меньше на 20–30%, но отладка по нему будет затруднена.Дополнительно можно прогнать через
upx — утилита сжимает исполняемый файл, он распаковывается уже в памяти при запуске.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤2
Anonymous Poll
32%
Да
50%
Нет
9%
Почти
9%
Отвечу в комментах
Паттерн
Можно реализовать через фасадную-прослойку: она
Переключение идёт через
Please open Telegram to view this post
VIEW IN TELEGRAM
В Go
syscall из golang.org/x/sys/unix или windows. Они предоставляют низкоуровневый интерфейс к вызовам ядра — например, можно вызвать syscall.Open, syscall.Read, syscall.Write или напрямую использовать syscall.Syscall(SYS_READ, ...), передавая номер системного вызова и аргументы.На практике прямое использование
syscall встречается редко, потому что стандартная библиотека Go уже абстрагирует большинство системных взаимодействий через пакеты os, net, io и другие. Под epoll, ptrace, seccomp, установке флагов дескрипторов или при написании системных утилит, где нужна максимальная гибкость без лишних обёрток.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)?
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
До версии 1.20 ошибки обрабатывались
errors.Join.err = errors.Join(function1(), function2())
if err != nil {
fmt.Println(err)
// выведет все ошибки через \n
errors.Join возвращает nil, если все переданные ошибки равны nil. Иначе он возвращает составную ошибку, которую можно раскрыть через errors.Unwrap.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
FieldsFunc пропускает любое количество подряд идущих разделителей и не создаёт пустых элементов между ними — в отличие от Split, который создаёт пустую строку на каждый лишний разделитель:data := []byte("foo,,bar,,,baz")
parts := bytes.FieldsFunc(data, func(r rune) bool {
return r == ','
})
// ["foo" "bar" "baz"]
bytes.Split([]byte("foo,,bar"), []byte(","))
// ["foo" "" "bar"] — пустой элемент между двумя запятымиPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥11