> Как реализовать паттерн singleton в Go? (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Axel Pro
Стек: Go
> Пример ответа
В Go паттерн singleton реализуется с помощью sync.Once, который гарантирует однократное выполнение инициализации:
GOpackage singletonimport "sync"type singleton struct {// поля структуры}var (instance *singletononce sync.Once)func GetInstance() *singleton {once.Do(func() {instance = &singleton{}})return instance}
Ключевые моменты:
-
sync.Onceобеспечивает потокобезопасность без блокировок после инициализации. -
Инициализация происходит лениво (lazy initialization) - только при первом вызове
GetInstance(). -
Альтернативный подход - использование
init()для ранней инициализации, но это лишает ленивости. -
Для глобального singleton можно использовать
sync.Mutex, ноsync.Onceэффективнее и проще.
Пример использования:
GOfunc main() {s1 := GetInstance()s2 := GetInstance()fmt.Println(s1 == s2) // true}
Важно: singleton в Go часто считается антипаттерном из-за усложнения тестирования и скрытых зависимостей. Вместо него рекомендуется использовать dependency injection.
> Похожие задачи по backend
Имеет ли смысл передавать слайс по указателю в Go
Что такое документные базы данных?
Почему Go хорошо работает с асинхронными задачами?
Как передача мьютекса по значению влияет на защиту от гонок в Go?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью