程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在GoLang中创建单例DB类大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在GoLang中创建单例DB类?

开发过程中遇到如何在GoLang中创建单例DB类的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在GoLang中创建单例DB类的解决方法建议,希望对你解决如何在GoLang中创建单例DB类有所启发或帮助;

一种方法是使用这些方法创建一个导出的接口,并使实现类型不导出。创建接口类型的全局变量,然后使用包init()函数对其进行初始化。您不需要任何同步,因为包init()功能只能安全地运行一次。

init()在您可以从包中引用任何内容之前,包功能会在运行时自动执行一次。有关详细信息,请参见Spec:包初始化。

例如:

package dbprovIDer

type Manager interface {
    AddArticle(article *article.Article) error
    // Add other methods
}

type manager struct {
    db *gorm.DB
}

var Mgr Manager

func init() {
    db, err := gorm.Open("sqlite3", "../articles.db")
    if err != nil {
        log.Fatal("Failed to init db:", err)
    }
    Mgr = &manager{db: db}
}

func (mgr *manager) AddArticle(article *article.Article) (err error) {
    mgr.db.Create(article)
    if errs := mgr.db.GetErrors(); len(errs) > 0 {
        err = errs[0]
    }
    return
}

使用它:

import "dbprovIDer"

if err := dbprovIDer.Mgr.AddArticle(someArticle); err != nil {
    // Handle error
}

您也可以不使用任何init()功能,例如:

var Mgr = newManager()

func newManager() Manager {
    db, err := gorm.Open("sqlite3", "../articles.db")
    if err != nil {
        log.Fatal("Failed to init db:", err)
    }
    return &manager{db: db}
}

这样,您可以决定进行newManager()导出,包的用户可以决定使用共享Mgr实例,或者他们可以创建另一个实例Manager(例如出于测试目的)。

Mgr是一个导出的全局变量,可以通过其他包(例如dbprovIDer.Mgr = nil)为其分配新值。如果要避免这种情况,则必须使其不导出,并为其提供“获取”功能,例如:

var mgr = newManager()

func Mgr() Manager { return mgr }

并使用它:

err := dbprovIDer.Mgr().AddArticle(someArticle)

解决方法

编辑已 解决 :如何在GoLang中创建单例DBManager类。

我参考了一些有关如何创建单例的代码示例,但是我希望在其中包含方法,并在其单例引用中对其进行调用。我的代码如下

package dbprovider

import (
    "github.com/jinzhu/gorm"
    _"github.com/jinzhu/gorm/dialects/sqlite"
    "rest/article"
    "log"
)

type DBOperations interface {
    AddArticle(article *article.Article)
}

type DBManager struct {
    db            *gorm.DB
    isInitialized bool
}

var dbManagerInstance = new()

func GetDBManager() DBManager {
    return dbManagerInstance
}

func new() DBManager {
    localDbRef,err := gorm.Open("sqlite3","../articles.db")
    if (err != nil) {
        panic("Error initializing db")
    } else {
        log.Print("DB Initialized successfully")
    }
    return DBManager{db:localDbRef,isInitialized:true}
}

func (dbManager DBManager)  AddArticle(article article.Article) (err error) {
    if (dbManager.isInitialized) {
        tx := dbManager.db.Begin()
        //dbManager.db.NewRecord(article)
        //dbManager.db.Commit()
        tx.NewRecord(article)
        tx.Commit()
        errs := dbManager.db.GetErrors()
        if (len(errs) > 0) {
            err = errs[0]
        } else {
            log.Print("No error in this transactions")
        }

    }
    return
}

通过新答案,我更新了此问题,包括答案。 但是我有一些疑问。如何从gorm.Create(..)进行Cathc并返回异常

大佬总结

以上是大佬教程为你收集整理的如何在GoLang中创建单例DB类全部内容,希望文章能够帮你解决如何在GoLang中创建单例DB类所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: