> Как реализовать паттерн singleton в Go? (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Axel Pro

Стек: Go

> Пример ответа

В Go паттерн singleton реализуется с помощью sync.Once, который гарантирует однократное выполнение инициализации:

GO
package singleton
import "sync"
type singleton struct {
// поля структуры
}
var (
instance *singleton
once sync.Once
)
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}

Ключевые моменты:

  • sync.Once обеспечивает потокобезопасность без блокировок после инициализации.

  • Инициализация происходит лениво (lazy initialization) - только при первом вызове GetInstance().

  • Альтернативный подход - использование init() для ранней инициализации, но это лишает ленивости.

  • Для глобального singleton можно использовать sync.Mutex, но sync.Once эффективнее и проще.

Пример использования:

GO
func main() {
s1 := GetInstance()
s2 := GetInstance()
fmt.Println(s1 == s2) // true
}

Важно: singleton в Go часто считается антипаттерном из-за усложнения тестирования и скрытых зависимостей. Вместо него рекомендуется использовать dependency injection.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью