我正在尝试从控制器返回处理函数
在我的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)
答案 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
,并从返回的函数中删除了包装器。