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
}
TA贡献1869条经验 获得超4个赞
type BaseDao struct {
FirstDao
SecondDao
}
func (dao *BaseDao) Get(id uint64) (*model.SecondModel, error) {
}
只是写下我的想法。也许这将有助于您解决您的解决方案
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
- 3 回答
- 0 关注
- 87 浏览
添加回答
举报