1 回答

TA贡献1843条经验 获得超7个赞
db变量的初始化是可以的。问题在于返回的错误。
如果您DbOnce()是第一次调用并且打开数据库连接失败,则会正确返回该错误。但是后续调用呢?db初始化代码不会再次运行,因此可能nil db会返回,并且由于未运行初始化代码,因此会返回err变量的默认值,即nil. 综上所述,初始化错误丢失,不再报错。
一种解决方案是在连接失败时停止应用程序(在第一次调用时)。另一种选择是将初始化错误与 一起存储在包级变量中db,并从中返回DbOnce()(而不是为此使用局部变量)。前者的优点是您不必处理从DbOnce()返回的错误,因为它甚至不必返回错误(如果出现错误,您的应用程序将终止)。
后者可能看起来像这样:
var (
once sync.Once
db *sql.DB
dbErr error
)
func DbOnce() (*sql.DB, error) {
once.Do(func() {
fmt.Println("Am called")
db, dbErr = sql.Open("mysql", "root:test@tcp(127.0.0.1:3306)/test")
if dbErr != nil {
return
}
dbErr = db.Ping()
})
return db, dbErr
}
- 1 回答
- 0 关注
- 81 浏览
添加回答
举报