当前位置: > > > > 如何处理单例仅一次的错误
来源: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的相关知识,请关注公众号!