栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在GoLang中创建单例DB类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在GoLang中创建单例DB类

一种方法是使用这些方法创建一个导出的接口,并使实现类型不导出。创建接口类型的全局变量,然后使用包

init()
函数对其进行初始化。您不需要任何同步,因为包
init()
功能只能安全地运行一次。

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

例如:

package dbprovidertype Manager interface {    AddArticle(article *article.Article) error    // Add other methods}type manager struct {    db *gorm.DB}var Mgr Managerfunc 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)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484309.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号