为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只斗牛犬 2022-08-24 15:40:10
在项目中使用 和。gogorm我创建了一个级别来包装数据库操作,每个表都有自己的 dao 类型。dao当前代码Get方法从表和:FirstDaofirstFirstModelfunc (dao *FirstDao) Get(id uint64) (*model.FirstModel, error) {}Get方法从表和:SecondDaosecondSecondModelfunc (dao *SecondDao) Get(id uint64) (*model.SecondModel, error) {}我想要实现的目标想知道是否可以用一种方法编写一个 in go,这样我就不必写这个代码 2 次了。BaseDaoGet()这在Java中非常容易,但是由于go非常不同,并且不支持真正的继承(我猜),所以不确定这是否可能。我尝试过什么定义一个模型接口,并尝试使用 refection。但失败了。主要原因:在方法内部,它仍然需要原始特定结构的实例,例如,我将其作为接口传递,并且不能将其用作原始类型。Get()model.FirstModel{}model.Model结构嵌入。谷歌搜索问题可以做到这一点吗?如果不是,为什么?如果是,如何?
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

如果您尝试完全绕过为每个 DAO 编写方法,则唯一的解决方案是从此方法返回 a。然而,这种方法会产生两个问题:Get()interface{}

  • 您需要手动将所有内容都强制转换。interface{}

  • 你正在破坏安全型。

我认为最好的解决方案是通过使用结构嵌入来共享大部分代码,并为每个DAO编写轻量级包装器,以将不安全的值转换为类型安全值。interface{}

首先使用泛型方法创建基本 DAO。Go 中没有类型泛型,因此应在此处返回 。Get()interface{}


type BaseDAO struct {}


func (*BaseDAO) Get(id uint64) (interface{}, error) {}

然后,对于每种类型的数据,创建一个特定的DAO实现,嵌入:BaseDAO


type FooModel = string


type 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

}


查看完整回答
反对 回复 2022-08-24
?
MMTTMM

TA贡献1869条经验 获得超4个赞

type BaseDao struct {

    FirstDao

    SecondDao

}


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

}

只是写下我的想法。也许这将有助于您解决您的解决方案


查看完整回答
反对 回复 2022-08-24
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

也许不能。因为围棋剂量不支持1.18之前的genrics。


我认为提取层可能是一个反模式,如果你想使用钩子。dao


想象一下:


// pkg models

type User

type UserChangeLog


func (user *User) afterUpdate(tx) error () {

  // if you want to record user changes

  userChangeLogDao().insert(user)

}

// pkg dao

func (userDao) update() {}

func (userChangeLogDao) insert(User){}

它导致道和模型之间import cycle


查看完整回答
反对 回复 2022-08-24
  • 3 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信