Golang потоковый ответ. Перейдите в другое тело HTTP-запроса - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь понять поведение Go на HTTP io.Reader для ответа. Обзор программы:

   req1, err := http.NewRequest("GET", url1, nil)
   resp1, err := httpClient.Do(req1)
   req2, err := http.NewRequest("PUT", url2, resp1.Body)
   httpClient.Do(req2)

Ожидается, что resp1.Body может быть очень большим (величина в ГБ). Я задаюсь вопросом: Будет ли Go полностью читать resp1.Body и сохранять его в оперативной памяти (или на диске?), Прежде чем открывать другой считыватель для второго запроса? Или Go достаточно умен, чтобы напрямую передавать тело из resp1 во второй запрос в качестве потока данных?

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

Идеальным поведением, которое я ожидаю, будет второй сценарий (Go выполняет потоковую передачу данных напрямую, без буферизации всего тела). В этом случае каждый поток будет использовать только буфер размером 32 КБ (Go по умолчанию для копирования?).

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