2017-02-18 17 views

ответ

1

Я не уверен, что вы подразумеваете под «эффективным», поэтому я предполагаю, что вы имеете в виду, что большие файлы передаются и не буферизуются.

Стандарт http.FileServer в конечном итоге записывает данные с использованием the serveContent function, что требует io.ReadSeeker в качестве содержимого (к счастью, файлы именно это).

Содержимое затем копируется с использованием io.Copy, которое в общем случае (хотя, вероятно, не ваш обычный случай, см. Ниже) означает copyBuffer. будет использовать буфер 32 КБ.

Следовательно, при условии, что реализация http.ResponseWriter не буферирует его ввод (it doesn't, см. Также chunked writer), использование памяти должно быть постоянным.

Однако, когда автор поддерживает метод ReadFrom, io.Copy will use that instead. Потому что http.response (стандартная реализация интерфейса ResponseWriter) implements the ReadFrom method, он будет использоваться вместо copyBuffer. Эта реализация, в свою очередь, попытается использовать системный вызов sendfile, когда это возможно (как в случае с os.File), что является более сильным значением эффективности (данные не обязательно должны проходить через пространство памяти процесса, так что как это получается).

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