创建用于通过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类型。
reflect.TypeOf(modelStruct)
基本上,我解决了将模型作为指针并在将其作为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())) }