为了账号安全,请及时绑定邮箱和手机立即绑定

定义具有接口返回类型的接口方法

定义具有接口返回类型的接口方法

Go
偶然的你 2021-09-10 15:18:53
如果您尝试运行它,这是一个演示该问题的操场:https : //play.golang.org/p/myQtUVg1iq我正在制作一个 REST API 并且有许多类型的资源可以通过 GET 请求检索GET http://localhost/api/usersGET http://localhost/api/groups我有一个模型包,它抽象了不同资源的实现方式:func(m *UserManager) Get() []Users {    // Internal logic, assume returns correct results}func(m *GroupManager) Get() []Groups {    // Internal logic, assume returns correct results}路由文件设置所有路由和处理程序:users := models.UserManager{}groups := models.GroupManager{}func GetUsersHandler (w http.ResponseWriter, r *http.Request) {    users := users.Get()    // Implementation details, writing to w as JSON}func GetGroupsHandler (w http.ResponseWriter, r *http.Request) {    groups := groups.Get()    // Implementation details, writing to w as JSON}func registerRoutes(r *mux.Router) {    r.handleFunc("/api/users", GetUsersHandler).Method("GET")    r.handleFunc("/api/groups", GetGroupsHandler).Method("GET")}我试图通过创建一个接口然后只需要一个 GetHandler 来使它更通用。像这样的东西:type Getter interface {    Get() []interface{}}func GetHandler(g Getter) {    return func(w http.ResponseWriter, r *http.Request) {        results := g.Get()        // Implementation details, writing to w as JSON    }}func registerRoutes(r *mux.Router) {    r.handleFunc("/api/users", GetHandler(&users)).Method("GET")    r.handleFunc("/api/groups", GetHandler(&groups)).Method("GET")}这真的很接近工作,唯一的问题是模型的返回类型是特定的对象类型,但接口只使用接口返回类型。有没有办法在不让模型返回的情况下解决这个问题[]interface{}?https://play.golang.org/p/myQtUVg1iq
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

尽量不要像处理其他 OOP 语言那样处理问题。在 Go 中你不能有协变容器,所以你要么必须使用一个空的interface{},要么你必须以不同的方式构建你的程序。

如果您的Get方法不同并且您想在接口中对类型进行分组,请使用另一种方法(有时我们甚至有专门用于接口的 noop 方法),或者只是传入usersgroups作为interface{}. 无论如何,您都需要在调用链中的某个点进行类型切换或断言,一旦您知道它是什么类型,您就可以相应地处理它。

没有更多代码很难说,但在这种情况下,最简单的方法可能就是让每个类型都是一个http.Handler自身,并且它可以相应地调度。


查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信