有几个数据库模型( Novel,Archives ),都是要增删改查的。用的是 Echo 框架。 本来想打算每个模型都对应一个请求模型,再 bind 到不同的 API。 即:
type NovelRequestGet struct{}
type NovelRequestDelete struct{}
...
type ArchiveRequestGet struct{}
type NovelRequestDelete struct{}
.....
echo.bind(&NovelRequest)
bind......
然后数据库操作一波,返回。
但是实际写的时候转念一想这不就是 CVM 嘛,除了传入变量类型不同其他代码完全一致。于是就用了 Interface。
type GetInterface interface {
Get()*serializer.Response //数据库查询操作
Response() *serializer.Response //返回数据
}
func Get(service _interface.GetInterface)echo.HandlerFunc {
return func(c echo.Context) (err error){
if err := c.Bind(&service); err == nil {
if err := service.Get(); err != nil {
return c.JSON(200, err)
} else {
res := service.Response()
return c.JSON(200, res)
}
} else {
return c.JSON(200, &serializer.Response{
Status: 40001,
Msg: "参数错误",
Error: fmt.Sprint(err),
})
}
}
}
最后绑定路由
var ArchiveGet archive.GetService
route.GET("/archive/:id", api.Get(&ArchiveGet))
这样本以为就可以实现泛型了,只要增删改查的业务就可以直接丢进来了。
然而,理想很美好,显示很骨干。
实际上运行
{
"status": 40001,
"data": null,
"msg": "参数错误",
"error": "code=400, message=binding element must be a struct"
}
还必须要转成 struct。。。
现在问题来了,请问各位老哥们:
目前感觉唯一的解法似乎就是自己整一个反射然后再 Bind,但是感觉在这样弄一个 Interface{}的意义似乎就没有了?
请各位大佬解惑,小弟在此谢谢大家了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.