В документации Go io.Reader
указано, что Read()
может возвращать ненулевое значение n
и io.EOF
одновременно. К сожалению, метод Read()
File
этого не делает.Как проверить EOF на io.Reader в Go?
Когда EOF достигнут, и некоторые байты все еще могут быть прочитаны, метод Read Read возвращает ненулевое значение n
и nil
. Только когда мы пытаемся читать, когда уже в конце файла мы возвращаем n
и io.EOF
в качестве ошибки.
Я не смог найти простой способ проверить, достиг ли EOF, не пытаясь прочитать данные из файла. Если мы выполняем Read() с буфером в 0 байт, мы возвращаем ноль n
и nil
ошибки, хотя мы находимся в конце файла.
Чтобы избежать этого последнего сообщения, единственным решением, которое я нашел, является отслеживание количества оставшихся байтов для чтения в файле. Есть ли более простое решение?
не AFAIK. вы можете использовать поиск или что-то, чтобы получить текущую позицию, но поскольку для этого потребуется больше системных вызовов, это будет медленнее. –
Почему бы не сделать тип, который _allways_ читает несколько байтов и возвращает EOF? – JimB
@JimB Это потрясающий трюк. Я приму это решение. Но вместо того, чтобы читать дальше, я буду следить за оставшимися байтами, чтобы я мог возвращать io.EOF как раз вовремя. Причина, по которой мне больше всего нравится, это то, что мне не нужно изменять код в моей программе. Мне нужно предоставить оболочку для файла. Если вы напишете хороший ответ с двумя вариантами, я дам вам это. – chmike