全局变量管理(以gorm为例)
大约 2 分钟
全局变量管理(以gorm为例)
在Go中,将数据库连接作为全局变量使用是一个常见的模式,尤其是对于像*gorm.DB这样的数据库句柄。
1. 定义全局变量
首先,定义一个全局变量来存储数据库连接。这个变量应该是包级私有的,即不对外暴露,以防止外部包不当地访问或修改这个变量。
package mydatabase
import (
"gorm.io/gorm"
)
var db *gorm.DB
2. 初始化数据库连接
使用一个初始化函数来设置数据库连接。这个函数通常在程序启动时被调用一次。
func InitDatabase(dsn string) error {
var err error
db, err = gorm.Open(gorm.Open(dsn), &gorm.Config{})
if err != nil {
return err
}
// 进行其他初始化操作,如自动迁移
return nil
}
// 调用方式,在main函数或init函数中:
// err := mydatabase.InitDatabase("dsn")
3. 提供访问器
提供一个函数来访问这个全局数据库变量。这样做可以防止直接访问全局变量,同时允许在获取连接时添加额外的逻辑,比如检查连接是否已经初始化。
func GetDatabase() *gorm.DB {
if db == nil {
panic("database not initialized")
}
return db
}
4. 确保线程安全
在并发环境中,确保初始化过程是线程安全的。可以使用sync.Once来保证数据库连接只被初始化一次。
import (
"sync"
)
var (
db *gorm.DB
once sync.Once
)
func InitDatabase(dsn string) {
once.Do(func() {
var err error
db, err = gorm.Open(gorm.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
// ...
})
}
5. 关闭数据库连接
提供一个关闭数据库连接的函数,可以在应用程序结束时调用它。
func CloseDatabase() {
sqlDB, err := db.DB()
if err != nil {
panic(err)
}
sqlDB.Close()
}
6. 使用数据库连接
在需要使用数据库连接的地方,通过调用GetDatabase()函数来获取连接。
db := mydatabase.GetDatabase()
// 使用 db 进行数据库操作