Возврат обработчика из метода struct в Golang дает ошибку - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь вернуть функцию-обработчик из контроллера

В моем 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 голосов
/ 15 сентября 2018

На самом деле это работает:

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

Я изменил тип возвращаемого значения на http.HandlerFunc и удалил оболочку из возвращаемой функции.

0 голосов
/ 15 сентября 2018

Вы не можете произвольно преобразовать функцию в 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) {
         // ...
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...