在项目中使用go
和gorm
。
我创建了一个dao
级别来 Package 数据库操作,每个表都有自己的dao类型。
当前代码
first
表和FirstModel
的FirstDao
中的Get
方法:
func (dao *FirstDao) Get(id uint64) (*model.FirstModel, error) {
}
second
表和SecondModel
的SecondDao
中的Get
方法:
func (dao *SecondDao) Get(id uint64) (*model.SecondModel, error) {
}
我想要达到的目标
我想知道是否有可能在go中用一个Get()
方法编写一个BaseDao
,这样我就不必写两遍这段代码了。
这在Java中非常容易,但是由于Go语言非常不同,并且不支持真正的继承(我猜),所以不确定这是否可能。
我所尝试的
- 定义一个模型接口,尝试使用反射。但是失败了。
主要原因:在Get()
方法内部,它仍然需要原始特定结构的示例,例如model.FirstModel{}
,我将其作为接口model.Model
传递,并且不能将其用作原始类型。
- 结构体嵌入。
- 谷歌搜索
问题
- 有可能做到吗?
- 如果没有,原因是什么?
- 如果是,如何处理?
3条答案
按热度按时间toiithl61#
如果你试图完全绕过为每个DAO编写
Get()
方法,你唯一的解决方案就是从这个方法返回一个interface{}
。interface{}
强制转换到所有位置。我认为最好的解决方案是通过使用结构嵌入来共享大部分代码,并为每个DAO编写轻量级 Package 器,以将不安全的
interface{}
转换为类型安全的值。示例
首先用泛型方法
Get()
创建你的基本DAO,Go语言中没有类型泛型,所以你应该在这里返回一个interface{}
。然后,为每种类型的数据创建一个特定的DAO实现,嵌入
BaseDAO
:11dmarpk2#
只是写下我的想法。也许这会帮助你找到你的解决方案
w1e3prcc3#
也许不能。因为go在1.18之前不支持genrics。
我认为如果你想使用hook,提取
dao
层可能是一个反模式。想象一下:
它导致dao和模型之间
import cycle