admin

Golang数据库管理器api概念,类型断言错误

sql

创建用于通过API获取数据的数据库管理器API的基本概念。我正在使用GORM来获取strcut实例的数据。因此,代表表的结构为300-400。

type Users struct {
  ID int64
  Name string
}

type Categories struct {
  ID int64
  Category string
}

下一步,我实现了一个函数,该函数通过表名(通过API端点参数获取的内容)返回结构的正确实例。

func GetModel(model string) interface{} {
  switch model {
  case "users":
    return Users{}
  case "categories"
    return Categories{}
  }
  return false
}

之后是一个操作结构,其中唯一一个字段是DB。有一些方法,例如我要使用GORM db.Last(&users)函数的GetLast()。

func (o Operations) GetLast(model string) interface{} {
  modelStruct := GetModel(model)
  .
  .
  .
  return o.DB.Last(&modelStruct)
}

有几点,所以这是我不知道的。当前解决方案无法正常工作,因为在这种情况下,它是一个接口{},我需要在此问题中添加)类型断言的更多信息。类型断言如下所示:

func (o Operations) GetLast(model string) interface{} {
  modelStruct := GetModel(model)
  .
  test := modelStruct.(Users)
  .
  return o.DB.Last(&test)
}

该解决方案有效,但是在这种情况下,我失去了模块化。我尝试使用reflect.TypeOf(modelStruct),但是它也无法正常工作,因为reflect.TypeOf的结果是reflect.Type,with不是golang类型。


阅读 179

收藏
2021-07-01

共1个答案

admin

基本上,我解决了将模型作为指针并在将其作为json文件返回后的问题。

所以我的模型如下:

var Models = map[string]interface{}{
    "users": new(Users),
    "categories": new(Categories),
}

然后按表类型返回一个新模型。我可以用于gorm First()函数。然后将其编组为json,然后返回。

func (o Operation) First(model string, query url.Values) string {
    modelStruct := Models[model]
    db := o.DB
    db.First(modelStruct)
    response, _ := json.Marshal(modelStruct)
    clear(modelStruct)
    return string(response)
}

在返回之前,我清除了模型指针,因为First()函数存储了最新查询的回调。

func clear(v interface{}) {
    p := reflect.ValueOf(v).Elem()
    p.Set(reflect.Zero(p.Type()))
}
2021-07-01