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 關注
- 92 瀏覽
添加回答
舉報