不懂就问, 关于动态类型的疑惑

felixzxk · 2022-05-20 10:20:18 · 3490 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-05-20 10:20:18 的主题,其中的信息可能已经有所发展或是发生改变。

我是个刚写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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3490 次点击  ∙  1 赞  
加入收藏 微博
10 回复  |  直到 2022-07-28 10:37:09
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传