登录
首页 >  Golang >  Go问答

如何处理单例仅一次的错误

来源:stackoverflow

时间:2024-04-20 14:09:36 123浏览 收藏

哈喽!今天心血来潮给大家带来了《如何处理单例仅一次的错误》,想必大家应该对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的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>