Если оставить в стороне аргумент того, является ли реализация шаблона синглтона хорошей идеей, вот возможная реализация:
package singleton
type single struct {
O interface{};
}
var instantiated *single = nil
func New() *single {
if instantiated == nil {
instantiated = new(single);
}
return instantiated;
}
single
и instantiated
являются частными, но New()
является публичными. Таким образом, вы не можете напрямую создать экземпляр single
, не пройдя через New()
, и он отслеживает количество экземпляров с помощью частного логического значения instantiated
. Отрегулируйте определение single
по вкусу.
Однако, поскольку у некоторых других отмечено , это не является поточно-ориентированным, если только вы не инициализируете свой синглтон в init()
. Лучшим подходом было бы использовать sync.Once
для выполнения тяжелой работы за вас:
package singleton
import "sync"
type single struct {
O interface{};
}
var instantiated *single
var once sync.Once
func New() *single {
once.Do(func() {
instantiated = &single{}
})
return instantiated
}
См. Также, предложение Хасана j просто думать о пакете как как о синглтоне. И, наконец, подумайте над тем, что предлагают другие: синглтоны часто являются индикатором проблемной реализации.