Каким образом http.HandlerFun c получает средство записи ответов и запросы, не передавая их явно? - PullRequest
0 голосов
/ 06 февраля 2020

Я учусь Go из PHP / JS фона. Я столкнулся с примером, когда я не совсем уверен, что происходит. Как timeHandler получает запросы http.ResponseWriter & http.Request, если они явно не переданы в вызов функции?

package main

import (
    "log"
    "net/http"
    "time"
)

func timeHandler(w http.ResponseWriter, r *http.Request) {
    tm := time.Now().Format(time.RFC1123)
    w.Write([]byte("The time is: " + tm))
}

func main() {
    mux := http.NewServeMux()

    // *** Why isn't there any undefined value errors here?
    th := http.HandlerFunc(timeHandler)

    mux.Handle("/time", th)

    http.ListenAndServe(":8080", mux)
}

В соответствующем сообщении не было достаточно ответов на этот вопрос. Нить в этом посте с Deefdragon проделала хорошую работу. Подводя итог:

регистрирует функцию, не вызывая ее до позже

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

В go функции являются первым классом , что означает, что они могут быть назначены переменным, переданы в функции et c.

В этом случае http.HandlerFun c принимает в качестве аргумента функцию (с параметрами write и request), создавая обработчик th. Затем он передается в мультиплексор.

Когда делается запрос к конечной точке времени, мультиплексор ищет правильный обработчик, th. Затем он выполняет th. (иногда называемый обратным вызовом)

Внутри th выполняется обратный вызов функции-обработчику, передавая аргументы w и r. Затем выполняется код в вашем примере

1 голос
/ 06 февраля 2020

Исходным кодом из документации

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

Как вы можете видеть, он передает функцию, которая должна иметь указанную c подпись. Он не вызывает ничего, просто использует указатель на него. Функция будет вызвана пакетом. Таким образом, для вызова пакета необходимо знать, какую подпись вызывать.

Вы можете подумать, что это интерфейс. Это просто декларация, реализация - это другое. Аргумент передается автоматически пакетом http, когда кто-то переходит на ваш URL.

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