编辑已 解决 :如何在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并返回异常
一种方法是使用这些方法创建一个导出的接口,并使实现类型不导出。创建接口类型的全局变量,然后使用包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)
我需要在Swift中创建一个singleton类。谁能帮我查一下密码吗?我已经知道,单例类在创建泛型代码方面非常有用。
我正在快速有效地学习单例模式来创建单例类,并找到了如下创建的最佳方法。 因为我使用了语句,所以它是只读属性,必须是线程安全的,所以从目标C开始就不需要调度一次。用于将变量设置为变量。 但这如何保证在整个应用程序中只创建一个实例呢?有什么我错过的小东西吗?
我读过,无融资创业时注入应该让所有孩子共享同一个实例,但是我的主组件和头组件(主应用程序包括头组件和路由器出口)各自获得了我的服务的单独实例。 我有一个FacebookService,用来调用facebook javascript api,还有一个UserService,使用FacebookService。这是我的引导程序: 从我的日志记录来看,引导调用似乎完成了,然后我看到在每个构造函数、Mai
问题内容: 这个问题不是为了讨论是否需要单例设计模式,是否是反模式,还是针对任何宗教战争,而是要讨论如何以最pythonic的方式在Python中最好地实现此模式。在这种情况下,我定义“最pythonic”表示它遵循“最小惊讶原则”。 我有多个将成为单例的类(我的用例用于记录器,但这并不重要)。当我可以简单地继承或修饰时,我不希望增加gumph来使几个类杂乱无章。 最佳方法: 方法1:装饰器 优点
问题内容: 我有一个需要将对象数组存储在变量中的要求。对象是不同类型的。请参考以下示例: 注意第二个元素是字符串本身的数组。经过研究,我想将其存储为以下接口类型: 尽管如此,我还是遇到了一些无法找到的编译错误。 问题答案: 您要的是可能的- 游乐场链接: 但是您可能不想这样做。您正在与类型系统进行斗争,如果您这样做,我会质疑您为什么要使用Go。考虑利用类型系统- 游乐场链接:
问题内容: 这里有人在Golang中编写了守护进程吗?你能指导我如何做吗?欢迎有用的链接。 问题答案: 是的,这已经完成。请参阅go-daemon项目。请注意,启动goroutine 后 在守护进程中发生某些问题。有关详细信息,请参见问题227。 目前,我建议您使用操作系统提供的实用程序。