当前位置: > > > > 如何处理单例仅一次的错误
如何处理单例仅一次的错误
来源:stackoverflow
2024-04-20 14:09:36
0浏览
收藏
哈喽!今天心血来潮给大家带来了《如何处理单例仅一次的错误》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!
问题内容
如何只处理一次单例错误?
我有一个单例服务,它仅在第一次调用时才会生成错误,然后返回已创建的实例。
服务如下所示:
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 只能生成一次?
正确答案
如果发生错误(仅一次),您的 databasesingleton 将不会被设置。在所有情况下您都应该返回错误。
尽管这不是您可以做的任何事情(因为由于使用了 sync.once,初始化 databasesingleton 的尝试不会重复),您也可以停止该应用程序。
事实上,推迟此初始化是没有意义的,您可以在包初始化期间执行此操作,如果失败则终止。如果成功,您可以使用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}
}
本篇关于《如何处理单例仅一次的错误》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注米云公众号!
