如何在Go中制作模型

时间:2013-07-21 01:46:19

标签: database model go

我想为我的框架制作模型,用go编写,我不知道如何以共享公共数据库交互方法的方式编写它们:保存,更新,删除。

我通常会通过为所有具体模型创建Model抽象父类来实现这一点,但Go没有继承。您应该使用嵌入和组合,但我不知道如何嵌入模型类并保存它的类的数据。

我看到了另一个选项,即创建一个在其中嵌入具体模型类型的模型类,但我并没有真正看到一个适用于所有模型的接口,除非它是空的。这带来了不安全感,任何东西都可以被视为一种模式。

做什么?

1 个答案:

答案 0 :(得分:4)

在我的项目中,我做了类似的事情:

type Storable interface {
    // called after unmarshalling from the database
    Init() error
    // called when an object is being deleted
    // this is useful if the object needs to delete other objects,
    // change state on a remote server, etc.
    Destroy() error
    // called after Init, helps separate initialization from
    // sanity checks (useful to detect errors before using a potentially
    // invalid object)
    Validate() error
    // type of this object, stored in the database in `Save` and `Update`
    // so it can be read out in `Get`
    Type() string
}

如果您正在使用SQL数据库,则可以执行以下操作:

type Schema map[string]reflect.Type

type SQLStorable interface {
    Storable
    Schema() Schema
}

然后在数据库中,我有这样的函数:

func Get(id string) (Storable, error)
func Save(Storable) error
func Update(id string, Storable) error
func Delete(id string) error
// register a type with the database (corresponds to the Type() in Storable)
func Register(typ string, reflect.Type)

我在数据库中保留了一个对象缓存:map[string]Storable。这允许我实现缓存逻辑以减少查找时间(每次从数据库读取时都不需要重建对象)。

在我的项目中,我有很多需要与其他包中的对象交谈的包。由于管理依赖链是一场噩梦,我已经建立了一个使用数据库的消息系统:

type Message map[string]interface{}
func Send(id string, Message)

我在Storable中添加了一个Receive函数,它接受Message并返回错误。到目前为止,这减轻了许多令人头疼的问题,并导致设计更加可插拔。

我不确定这是否是“Go way”,但它避免了继承的想法并解决了问题。在数据库逻辑中,我使用大量的反射来从数据库中获取数据并用它填充对象。它会导致一些不幸的类型断言,但我想在尝试保持抽象时不能真正有所帮助。