Singleton гарантирует, что объект создаётся ровно один раз за время жизни программы. В Go идиоматичный способ — sync.Once.
var (
instance *Database
once sync.Once
)
func GetDB() *Database {
once.Do(func() {
instance = &Database{conn: connect()}
})
return instance
}
sync.Once потокобезопасен и гарантирует, что функция вызовется только один раз, даже при конкурентном доступе из тысячи горутин. Не используй init() для синглтона — он вызывается при импорте пакета и усложняет тестирование. В целом, синглтон считается антипаттерном — лучше передавай зависимости явно.