从Golang中的struct方法返回处理程序会产生错误

时间:2018-09-15 13:36:29

标签: go

我正在尝试从控制器返回处理函数

在我的controllers/item.go文件中:

package controllers

import (
 // ...
)

type Controller struct{}

func (c Controller) GetItems(db *sql.DB) http.Handler {
    return http.Handler(func(w http.ResponseWriter, r *http.Request) {
      // ...
    })
}

在我的main.go文件中:

func main() {
    db = db.Connect()
    router := mux.NewRouter()

    controllers := controllers.Controller{}

    router.HandleFunc("/items", controllers.GetItems(db)).Methods("GET")
}

您可以看到我正在使用mux。我的问题是我无法返回处理程序函数。我不断收到此错误:

 cannot convert func literal (type func(http.ResponseWriter, *http.Request)) to type http.Handler:
    func(http.ResponseWriter, *http.Request) does not implement http.Handler (missing ServeHTTP method)

2 个答案:

答案 0 :(得分:0)

您不能随意将函数转换为http.Handler,但是http包确实提供了一种方便的http.Handler结构类型,它可以满足http.Handler接口,您可以轻松返回此类型的实例:

func (c Controller) GetItems(db *sql.DB) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
         // ...
    })
}

答案 1 :(得分:0)

这实际上有效:

func (c Controller) GetItems(db *sql.DB) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
          //...
  } 
}

我将返回类型更改为http.HandlerFunc,并从返回的函数中删除了包装器。