forked from AlexanderGrom/go-patterns
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsingleton.go
32 lines (26 loc) · 1.37 KB
/
singleton.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Паттерн Одиночка (Singleton)
//
// В данном примере описан потоко-безопасный метод, используя пакет sync.
// В противном случае, несколько go-рутин могут создать несколько
// экземпляров типа *singleton, каждый из которых затрет собой instance.
package singleton
import (
"sync"
)
// Тип singleton, экземпляр которого требуется создавать
type singleton struct {
}
// Инстанс, который будет содержать единственный экземпляр типа *singleton
var instance *singleton
// Объект, который позволяет выполнять некоторое действие только один раз
var once sync.Once
// Функция создает и возвращает экземпляр типа *singleton
func GetInstance() *singleton {
// Метод once.Do вызовет переданую в него функцию только один раз.
// Под капотом используется пакет sync/atomic для обеспечения атомарности операции
// и блокировки с помощью мьютексов.
once.Do(func() {
instance = &singleton{}
})
return instance
}