在项目中,全局变量使用的较为普遍,如全局DB连接池、Redis连接池等。
初始化
Go的全局变量,在main函数执行前初始化。
1 | var a = 1 |
- 数据库连接
database初始化数据库连接1
2
3
4
5
6
7
8
9
10package database
var Instance *gorm.DB
// init
func init() {
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
if err != nil {
log.Fatalf("failed to connect database:%s", err.Error())
}
Instance = db
}
使用
1 | package main |
使用uber的dig库管理全局变量
- 示例1
安装1
go get go.uber.org/dig
1 | package app |
使用
1 | package main |
- 示例2
延迟加载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
31package app
// container instance
var container = dig.New()
// EventManager
type EventManager struct {
events []Event
}
// Event
type Event struct {
Name string
}
// Register add events
func (m *EventManager) Register(e Event) {
m.events = append(m.events, e)
}
// GetEventManager
func GetEventManager() (manager *EventManager) {
if err := container.Invoke(func(m *EventManager) {
manager = m
}); err != nil {
manager = &EventManager{events: make([]Event)}
// register into container
_ = Container.Provide(func() *EventManager{
return manager
})
}
return
}
// usage
// app.GetEventManager().Register(ev)
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2020/03/30/Golang代码优化02-全局变量/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!