单例模式
# 代码实现
package main
import (
"fmt"
"sync"
)
var once sync.Once
var lock = &sync.Mutex{}
type single struct {
}
var singleInstance *single
var singleInstance2 *single
func getInstance() *single {
if singleInstance == nil {
lock.Lock()
defer lock.Unlock()
if singleInstance == nil {
fmt.Println("Creating single instance now")
singleInstance = &single{}
} else {
fmt.Println("Single instance already created.")
}
} else {
fmt.Println("Single instance already created.")
}
return singleInstance
}
// 利用 once.do 实现
func getInstanceBySyncOnce() *single {
if singleInstance2 == nil {
once.Do(func() {
fmt.Println("Creating single instance2 now")
singleInstance2 = &single{}
})
} else {
fmt.Println("Single instance2 already created.")
}
return singleInstance2
}
func main() {
getInstance()
getInstance()
getInstance()
getInstanceBySyncOnce()
getInstanceBySyncOnce()
getInstanceBySyncOnce()
}
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
编辑 (opens new window)
上次更新: 2023/03/13, 15:09:59