Как работает создание обработчиков? - PullRequest
0 голосов
/ 24 января 2019

Я смотрю на этот пример

var name string

type helloWorldResponse struct {
    Message string `json:"message"`
}

type helloWorldRequest struct {
    Name string `json:"name"`
}

func main() {
    port := 8080

    handler := newValidationHandler(newHelloWorldHandler())
    http.Handle("/helloworld", handler)
    log.Printf("Server starting on port %v\n", port)
    log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", port), nil))
}

type validationHandler struct {
    next http.Handler
}

func newValidationHandler(next http.Handler) http.Handler {
    return validationHandler{next: next}
}

func (h validationHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
    var request helloWorldRequest
    decoder := json.NewDecoder(r.Body)

    err := decoder.Decode(&request)
    if err != nil {
        http.Error(rw, "Bad request", http.StatusBadRequest)
        return
    }

    name = request.Name
    h.next.ServeHTTP(rw, r)
}

type helloWorldHandler struct{}

func newHelloWorldHandler() http.Handler {
    return helloWorldHandler{}
}

func (h helloWorldHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
    response := helloWorldResponse{Message: "Hello " + name}

    encoder := json.NewEncoder(rw)
    encoder.Encode(response)
}

Автор кода объяснил, что мы собираемся соединять обработчики вместе, первый обработчик, который является нашим обработчиком проверки, должен иметь ссылку на следующий в цепочке, так как он несет ответственность за вызов ServeHTTP или возвращающий ответ. Я новичок в Go, и я не понимаю эту строку

return validationHandler{next: next}

Какую структуру данных представляет next:next?

1 Ответ

0 голосов
/ 24 января 2019
type validationHandler struct {
    next http.Handler // 1
}

func newValidationHandler(next /* 2 */ http.Handler) http.Handler { 
    return validationHandler{next: next} 
    //                         1     2
}

next число 1 - это поле из структуры validationHandler (несколько строк выше).А другой next является параметром метода (из подписи).В общем, это просто устанавливает поле в структуре.Нет магии.

Какую структуру данных представляет next:next?

Не структура данных.Это синтаксис инициализации структуры.Смотрите больше примеров здесь: https://gobyexample.com/structs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...