如何只處理一次單例錯誤?
我有一個單例服務,它只能在第一次呼叫時產生錯誤,然后它回傳已經創建的實體。
服務如下所示:
package data
import (
"sync"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
var (
databaseSingleton *gorm.DB
once sync.Once
)
func NewDatabase() (*gorm.DB, error) {
once.Do(func() {
// ...
databaseSingleton, err = gorm.Open(postgres.Open(connectionString), config)
if err != nil {
return nil, err
}
})
return databaseSingleton, nil
}
問題是使用databaseSingleton上述句柄錯誤的多個服務只能發生一次。
使用的服務databaseSingleton如下所示:
func NewServiceOne() (ServiceOne, error) {
database, err := NewDatabase()
// want omit this error handling
if err != nil {
return nil, err
}
return &serviceOne{database}, nil
}
func NewServiceTwo() (ServiceTwo, error) {
database, err := NewDatabase()
// want omit this error handling
if err != nil {
return nil, err
}
return &serviceTwo{database}, nil
}
func NewServiceThree() (ServiceThree, error) {
database, err := NewDatabase()
// want omit this error handling
if err != nil {
return nil, err
}
return &serviceThree{database}, nil
}
如果有什么方法可以省略這種錯誤處理,因為err只能生成一次?
uj5u.com熱心網友回復:
如果錯誤發生(僅一次),您databaseSingleton將不會被設定。您應該在所有情況下都回傳錯誤。
盡管這不是您可以做的任何事情(因為初始化的嘗試databaseSingleton不會由于使用而重復sync.Once),但您也可以停止應用程式。
事實上,推遲這個初始化是沒有意義的,你可以在包初始化期間進行,如果失敗則終止。如果成功,您databaseSingleton無需檢查初始化錯誤即可使用。
所以簡單地這樣做:
var databaseSingleton *gorm.DB
func init() {
var err error
databaseSingleton, err = gorm.Open(postgres.Open(connectionString), config)
if err != nil {
log.Fatalf("Failed to connect to DB: %v", err)
}
}
NewServiceOne()可能看起來像這樣:
func NewServiceOne() ServiceOne {
return &serviceOne{databaseSingleton}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/436605.html
