一尘不染

Golang数据库管理器api概念,类型声明错误

go

创建用于通过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类型。


阅读 213

收藏
2020-07-02

共1个答案

一尘不染

基本上,我解决了将模型作为指针并在将其作为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()))
}
2020-07-02