Gorm:是否可以为常见的数据库操作定义共享方法(例如,通过id获取)?

在项目中使用 和。gogorm


我创建了一个级别来包装数据库操作,每个表都有自己的 dao 类型。dao


当前代码

Get方法从表和:FirstDaofirstFirstModel


func (dao *FirstDao) Get(id uint64) (*model.FirstModel, error) {

}

Get方法从表和:SecondDaosecondSecondModel


func (dao *SecondDao) Get(id uint64) (*model.SecondModel, error) {

}

我想要实现的目标

想知道是否可以用一种方法编写一个 in go,这样我就不必写这个代码 2 次了。BaseDaoGet()


这在Java中非常容易,但是由于go非常不同,并且不支持真正的继承(我猜),所以不确定这是否可能。

我尝试过什么

  • 定义一个模型接口,并尝试使用 refection。但失败了。
    主要原因:在方法内部,它仍然需要原始特定结构的实例,例如,我将其作为接口传递,并且不能将其用作原始类型。Get()model.FirstModel{}model.Model

  • 结构嵌入。

  • 谷歌搜索


问题

  • 可以做到这一点吗?

  • 如果不是,为什么?

  • 如果是,如何?


一只斗牛犬
浏览 92回答 3
3回答

温温酱

如果您尝试完全绕过为每个 DAO 编写方法,则唯一的解决方案是从此方法返回 a。然而,这种方法会产生两个问题:Get()interface{}您需要手动将所有内容都强制转换。interface{}你正在破坏安全型。我认为最好的解决方案是通过使用结构嵌入来共享大部分代码,并为每个DAO编写轻量级包装器,以将不安全的值转换为类型安全值。interface{}例首先使用泛型方法创建基本 DAO。Go 中没有类型泛型,因此应在此处返回 。Get()interface{}type BaseDAO struct {}func (*BaseDAO) Get(id uint64) (interface{}, error) {}然后,对于每种类型的数据,创建一个特定的DAO实现,嵌入:BaseDAOtype FooModel = stringtype FooDAO struct {    // Embbeding BaseDAO by not specifying a name on this field    // BaseDAO methods can be called from FooDAO instances    BaseDAO}func (foo *FooDAO) Get(id uint64) (FooModel, error) {    // Call the shared Get() method from BaseDAO.    // You can see this just like a `super.Get()` call in Java.    result, _ := foo.BaseDAO.Get(id)    return result.(FooModel), nil}

MMTTMM

type BaseDao struct {    FirstDao    SecondDao}func (dao *BaseDao) Get(id uint64) (*model.SecondModel, error) {}只是写下我的想法。也许这将有助于您解决您的解决方案

慕尼黑8549860

也许不能。因为围棋剂量不支持1.18之前的genrics。我认为提取层可能是一个反模式,如果你想使用钩子。dao想象一下:// pkg modelstype Usertype UserChangeLogfunc (user *User) afterUpdate(tx) error () {  // if you want to record user changes  userChangeLogDao().insert(user)}// pkg daofunc (userDao) update() {}func (userChangeLogDao) insert(User){}它导致道和模型之间import cycle
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go