**我是个刚写go的小白, 之前写前端的, 所以以下问题可能比较傻, 如果引起大佬不适请见谅 **
1. 写了个web服务, 感觉大部分业务模块的增删改查操作可以通用, 所以在model包里写了个通用的struct;
```
package model
type _model struct {
TableName string
ParseQuery func(map[string]any, *gorm.DB) *gorm.DB
...
}
func (model Model) GetById(id uint) error {....}
func (model Model) Create(data any) error {....}
....
// 其他通用的方法
```
2. 然后其他各个业务模块都继承这个struct
```
// 这个是bar业务模块的文件bar.go
package model
// 声明这个业务模块的表结构
type Bar struct {
ID uint `json:"id,omitempty" gorm:"primarykey;uniqueIndex"`
Name string `json:"name,omitempty" gorm:"type:varchar(32);default:NULL"`
Pid uint `json:"pid,omitempty" gorm:"type:int"`
Status uint `json:"status,omitempty" gorm:"type:bytes;default:1"`
}
// bar业务模块继承_model
type barFromModel struct {
_model
}
// 实例化
var BarModel barFromModel
func init(){
BarModel.TableName = "bars"
BarModelParseQuery = func(...) *gorm.DB {....}
...
}
// 定义一些该模块特有的方法
func (model BarModel) MyMethod(){.....}
```
3. 在api包中调用model包中的相关方法
```
package apibar
func Create(c *gin.Context) {
....
// 调用通用方法
err := model.BarModel.create(.....)
....
}
```
4. **问题来了**
如果我想在定义_model的方法时, 明确的知道是哪个模块在调用这个通用方, 并明确的获得此模块的表结构(type), 甚至在通用方法中通用方法中实例化业务模块的表结构
```
package model
type _model struct {
TableName string
ParseQuery func(map[string]any, *gorm.DB) *gorm.DB
...
}
func (model Model) GetById(id uint) error {....}
func (model Model) Create(data any) error {
/*============================
我想在这里通过 model获得当前调用通用方法的子类是谁,
如果能在这里明确获得Bar(表结构的结构体类型)就好了
如果能实例化上述结构体就更好了
o2 请问大佬们, 可以做到吗?
=============================*/
}
....
```
Go只有has a没有is a,换句话说就是“单向链表”,outer可以获取inner而不能反过来。
接口除外,小的接口可以通过断言获取更大的接口。
#6
更多评论