Почему http.ResponseWriter не реализует вызов End () потока ответа? - PullRequest
0 голосов
/ 27 марта 2020

В Node.js, чтобы завершить sh запись в поток (и теоретически с HTTP, сообщить клиенту, что данных больше нет), мы используем response.end(). При использовании Go интерфейс ResponseWriter выглядит следующим образом:

type ResponseWriter interface {
    Header() Header
    Write([]byte) (int, error)
    WriteHeader(statusCode int)
}

, поэтому мой вопрос состоит из двух частей:

  1. Как мы можем получить код состояния HTTP от ResponseWriter?
  2. , что более важно: Как Go (и маршрутизаторы, такие как Mux) узнают, когда программист завершил запись в ResponseWriter? Это когда рутина заканчивается? Что если вы захотите завершить sh ответ до того, как стек станины будет пуст? Похоже, недостаток реализации в том, что в интерфейсе ResponseWriter отсутствует метод End ().

1 Ответ

2 голосов
/ 27 марта 2020
  1. Это невозможно при стандартной реализации http.ResponseWriter. Но это интерфейс, поэтому легко написать собственную реализацию, которая записывает статус. Начало простой реализации может быть следующим:

    type statusRecorder struct {
        http.ResponseWriter
        status int
    }
    
    func (r *statusRecorder) WriteHeader(status int) {
        r.status = status
        r.ResponseWriter.WriteHeader(status)
    }
    

    Хотя это может показаться ограничением API, на самом деле все наоборот. Используя интерфейс, можно создать реализацию, которая делает что-либо или записывает любую информацию, которую вы хотите, вместо того, чтобы ограничиваться какой-либо функциональностью, которую авторы стандартной библиотеки, возможно, решили раскрыть.

  2. Когда обработчик возвращается, это сделано. Если вы хотите выполнить дополнительную работу после отправки ответа sh, вы можете запустить программу, чтобы продолжить работу после возвращения основного обработчика.

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