我是个刚写go的小白, 之前写前端的, 所以以下问题可能比较傻, 如果引起大佬不适请见谅
写了个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 {....} .... // 其他通用的方法
然后其他各个业务模块都继承这个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" BarModel.ParseQuery = func(...) *gorm.DB {....} ... } // 定义一些该模块特有的方法 func (model BarModel) MyMethod(){.....}
在api包中调用model包中的相关方法
package apibar func Create(c *gin.Context) { .... // 调用通用方法 err := model.BarModel.Create(.....) .... }
问题来了
如果我想在定义_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获得当前调用通用方法的子类是谁, 假设执行了model.BarModel.Create方法 如果能在这里明确获得Bar(表结构的结构体类型)就好了 如果能实例化上述结构体就更好了 =============================*/ } ....
o2 请问大佬们, 可以做到吗?
go解析是隐式的,这点其实很多人吐槽的。
针对你的问题,可以用反射。
reflect.TypeOf(model)
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。