跳至主要內容

全局变量管理(以gorm为例)

Mr.Lexon大约 2 分钟back-end

全局变量管理(以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 进行数据库操作
上次编辑于:
贡献者: Lexon