今天碰到一个局部变量替代了全局变量的问题。

package components

import (
    "myshop/config"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

// DB *gorm.DB
var DB *gorm.DB

// DbRegister db 组件注册器
func DbRegister() {
    DB, err := gorm.Open(config.DBConfig.Engine, config.DBConfig.URL)
    if err != nil {
        panic(err)
    }

    if config.DBConfig.SQLLog {
        DB.LogMode(true)
    }

    DB.DB().SetMaxIdleConns(config.DBConfig.MaxIdleConns)
    DB.DB().SetMaxOpenConns(config.DBConfig.MaxOpenConns)
}

这里我定义了一个 DB 全局变量,我希望运行 DbRegister() 来初始化 DB 变量。

于是我这样写 DB, err := gorm.Open(config.DBConfig.Engine, config.DBConfig.URL), 然而实际情况是这将重新定义了一个名为 DB 的局部变量,覆盖了全局的 DB, 导致全局的 DB 始终为 nil.

因此这里不能用简短赋值语句。

// DbRegister db 组件注册器
func DbRegister() {
    var err error
    DB, err = gorm.Open(config.DBConfig.Engine, config.DBConfig.URL)
    if err != nil {
        panic(err)
    }

    if config.DBConfig.SQLLog {
        DB.LogMode(true)
    }

    DB.DB().SetMaxIdleConns(config.DBConfig.MaxIdleConns)
    DB.DB().SetMaxOpenConns(config.DBConfig.MaxOpenConns)
}

标签: golang

添加新评论