简体   繁体   English

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

[英]Golang database manager api concept, error with type assertion

The base concept creating a Database Manager API for getting data through an API. 创建数据库管理器API以通过API获取数据的基本概念。 I am using the GORM for getting data of the instances of the strcuts. 我正在使用GORM来获取strcuts实例的数据。 So there is 300-400 struct which represents the tables. 所以有300-400结构代表表。

type Users struct {
  ID int64
  Name string
}

type Categories struct {
  ID int64
  Category string
}

The next step I implement a function which is return the correct instance of the struct by table name, what I get through the API endpoint param. 下一步我实现一个函数,它通过表名返回结构的正确实例,我通过API端点参数得到了什么。

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

After there is an operations struct where the only one field is the DB. 在有一个操作结构之后,只有一个字段是DB。 There is methods, for example the GetLast() where I want to use the GORM db.Last(&users) function. 有方法,例如GetLast(),我想使用GORM db.Last(&users)函数。

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

There is points so this is what I don't know. 有分,所以这是我不知道的。 The current solution is not working because in this case it is an interface{} I need make a type assertion more info in this question . 当前的解决方案不起作用,因为在这种情况下它是一个接口{}我需要在这个问题中做一个类型断言更多的信息 The type assertion is looks like: 类型断言看起来像:

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

This solution working, but in this case I lost the modularity. 这个解决方案有效,但在这种情况下我失去了模块化。 I try using the reflect.TypeOf(modelStruct) , but it is also not working because the result of the reflect.TypeOf is a reflect.Type, with is not a golang type. 我尝试使用reflect.TypeOf(modelStruct) ,但它也无法正常工作,因为reflect.TypeOf的结果是一个reflect.Type,而不是golang类型。

Basically I solved the problem, for getting the model as a pointer, and after I return it back as a json file. 基本上我解决了这个问题,将模型作为指针,然后将其作为json文件返回。

So my model is the following: 所以我的模型如下:

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

And it is return back a new model by table type. 它按表格类型返回一个新模型。 what I can use for gorm First() function. 我可以用于gorm First()函数。 Then json Marshal it, and return. 然后json Marshal吧,并返回。

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)
}

Before the return I clear the model pointer because the First() function store callbacks for the latest queries. 在返回之前,我清除了模型指针,因为First()函数存储了最新查询的回调。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM