sil*_*udo 9 singleton-methods go go-gorm
编辑 解决:如何在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
}
Run Code Online (Sandbox Code Playgroud)
有了新的答案,我更新了这个问题,包括答案.但我几乎没有疑问.如何从gorm中创建cathc并返回异常.创建(..)
icz*_*cza 15
一种方法是使用方法创建导出的接口,并使实现类型不导出.创建接口类型的全局变量,并使用包init()
函数初始化它.您不需要任何同步,因为包init()
函数只能安全地运行一次.
init()
在您从包中引用任何内容之前,程序包函数由运行时自动执行一次.有关详细信息,请参阅规范:包初始化.
例如:
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
}
Run Code Online (Sandbox Code Playgroud)
使用它:
import "dbprovider"
if err := dbprovider.Mgr.AddArticle(someArticle); err != nil {
// Handle error
}
Run Code Online (Sandbox Code Playgroud)
您也可以在没有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}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,您可能决定进行newManager()
导出,并且您的包的用户可以决定使用共享Mgr
实例,或者他们可以创建另一个Manager
,例如用于测试目的.
注意: Mgr
是一个导出的全局变量,可以通过其他包(例如dbprovider.Mgr = nil
)为其分配新值.如果你想避免这种情况,你必须使它成为未导出的,并为它提供一个"getter"函数,例如:
var mgr = newManager()
func Mgr() Manager { return mgr }
Run Code Online (Sandbox Code Playgroud)
并使用它:
err := dbprovider.Mgr().AddArticle(someArticle)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5097 次 |
最近记录: |