go - Go中数据的分层抽象

标签 go

我打算在 Go 中创建一个项目,但我想分开我的层。我的目标是创建一个包含类似于 DAO 模式的代码的包,即我希望我的调用者只与服务的接口(interface)(可能是另一个项目)而不是与实现进行通信。这是为了避免将来数据库发生更改的情况,调用者不应更改,并且应对此更改透明。

我正在考虑创建一个项目数据库,其中包含一个名为 persistence 的文件以及一个包 persistence

http://play.golang.org/p/O9b93F4LJp

package persistence

// Interface that have the CRUD which I need to use from service(another project)
type Recorder interface {
    Selectkey([]byte) (err error)
    Insert([]byte, []byte) (err error)
    Update([]byte, []byte) (err error)
    Delete([]byte) (err error)
}

// Struct for Oracle
type ManageDataOracle struct {
}
// Struct for binaryTree
type ManageDataBInaryTree struct {
}
// Struct for MongoDB
type ManageDataMongoDb struct {
}

// Implemtations for Oracle
func (memory *ManageDataOracle) SelectKey(pKey []byte) error {
    // Logic for Oracle Here
    return nil
}
func (memory *ManageDataOracle) Insert(pKey []byte, pValue []byte) error {
        // Logic for Oracle Here
    return nil
}
func (memory *ManageDataOracle) Update(pKey []byte, pValue []byte) error {
    // Logic for Oracle Here
    return nil
}

func (memory *ManageDataOracle) Delete(pKey []byte) error {
    // Logic for Oracle Here
    return nil
}

// Implemtations for Binary Tree
func (memory *ManageDataBInaryTree) SelectKey(pKey []byte) error {
    // Logic for Binary tree Here
    return nil
}
func (memory *ManageDataBInaryTree) Insert(pKey []byte, pValue []byte) error {
        // Logic for Binary tree Here
    return nil
}
func (memory *ManageDataBInaryTree) Update(pKey []byte, pValue []byte) error {
    // Logic for Binary tree Here
    return nil
}    

func (memory *ManageDataBInaryTree) Delete(pKey []byte) error {
    // Logic for Binary tree Here
    return nil
}

// Implemtations for Mongo DB
func (memory *ManageDataMongoDb) SelectKey(pKey []byte) error {
    // Logic for MongoDB Here
    return nil
}
func (memory *ManageDataMongoDb) Insert(pKey []byte, pValue []byte) error {
        // Logic for MongoDB Here
    return nil
}
func (memory *ManageDataMongoDb) Update(pKey []byte, pValue []byte) error {
    // Logic for MongoDB Here
    return nil
}

func (memory *ManageDataMongoDb) Delete(pKey []byte) error {
    // Logic for MongoDB Here
    return nil
}

关于如何进行这种概念分离,或者应该如何从另一个项目调用以前的代码,有什么建议吗?

最佳答案

您走在正确的轨道上,但不同的持久化机制将使用不同的键类型(例如,oracle 中的整数和 mongo 中的类似字符串的标识符)。

将数据序列化为 []byte 应该由抽象层处理,因为不同的底层持久化引擎将使用不同的数据表示形式。例如,考虑一个整数及其字节顺序。

因此,我会将您的界面签名更改为以下内容:

type Recorder interface {
    SelectByKey(interface{}) error
    DeleteByKey(interface{}) error
    Insert(interface{}, interface{}) error
    Update(interface{}, interface{}) error
}

这样你也可以在里面panic,如果给定的键不是特定实现的正确类型,比如SelectKey。如果您事先序列化您的 key 并且会导致麻烦,这是不可能的。

关于go - Go中数据的分层抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999131/

相关文章:

io - 有没有办法将 []byte slice 转换为 io.Reader?

go - 在 golang 中,如果文件不存在,则 os.OpenFile 不会返回 os.ErrNotExist

json - 使用 Go 获取 JSON 数组中的特定键

go - 如何在golang中动态运行函数?

go - 使用 Truetype 对齐 golang 中的文本

go - Docker 守护进程不启动或重新启动

http - 使用 Go 时更新生产服务器上的代码

Go:使用数据库初始化从多个包运行测试

go - 如何从另一个函数调用 dbmap.Insert(interface{})?

go - 从另一个包引用结构域