Я использую функцию, которая возвращает io.Reader
для загрузки файла из Интернета.
Я хочу обработать файл ровно 2048 порциями, пока он не станет невозможным из-за EOF.
Функция io.ReadFull
- это почти то, что я хочу:
buf := make([]byte, 2048)
for {
if _, err := io.ReadFull(reader, buf); err == io.EOF {
return io.ErrUnexpectedEOF
} else if err != nil {
return err
}
// Do processing on buf
}
Проблема в том, что не все файлы кратны 2048 байтам, поэтому последний фрагмент может быть только, например, 500 байтов, поэтому io.ReadFull
вернет ErrUnexpectedEOF
, а последний кусок будет отброшен.
Имя функции для суммирования того, что я хочу, может быть io.ReadFullUnlessLastChunk , поэтому ErrUnexpectedEOF
не возвращается, если причина, по которой buf
не может быть заполнена 2048 байтами, состоит в том, что файл EOF например, после 500 байтов. Однако в любом другом случае ErrUnexpectedEOF
должен быть возвращен, поскольку возникла проблема.
Что я мог сделать, чтобы достичь этого?
Другая проблема состоит в том, что чтение только 2048 байтов в то время непосредственно из сети, по-видимому, будет иметь большие издержки, если бы я мог получить 256 КБ из сети в буфер, а затем вместо этого взять 2048 байтов, которые мне нужны, из этого буфера, что было бы лучше.