golang bufio.Read или bufio.ReadByte, чтобы определить, находится ли файл в EOF

Это чистое решение для JavaScript без каких-либо библиотек или плагинов:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

, где hasClass -

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

Кредит относится к Dave и Sime Vidas

Использование более современных JS, hasClass может быть реализовано как:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}

1
задан init_js 28 March 2019 в 17:40
поделиться

1 ответ

Передача буфера длиной от 1 до bufio.Read, , когда для считывателя поддерживается базовый файл os.File , действительно вернет n==0, io.EOF, если файл находится в EOF.

Документация немного неточна, потому что часть поведения зависит от основного читателя, который вы передаете читателю bufio. Код для bufio.Read() рисует более точную картину. Я обрисую логику.

bufio.Read: Выдает Read только базовому считывателю, если все байты во внутреннем буфере были исчерпаны. Таким образом, по-видимому, если вы уже прочитали столько байтов из буферизованного считывателя, сколько байтов в базовом файле, этот внутренний буфер должен быть исчерпан при последнем вызове bufio.Read(buf[0:1]) для проверки EOF.

Когда внутренний буфер исчерпан, и вы запрашиваете у читателя bufio больше, bufio.Read выполнит максимум один вызов основного читателя. Тип ошибки, которую вы получите, будет зависеть от вашего основного читателя.

Запрос на чтение n > 0 байтов из os.File, когда указатель чтения уже находится в EOF, должен вернуть 0, io.EOF (согласно документу на os.File File.Read ). Но если ваш базовый читатель был чем-то другим, возможно, пользовательским типом, специфичным для вашего приложения, предназначенным для возврата 0, nil в EOF, то bufio.Read вместо этого отразит это обратно.

bufio.ReadByte: Логика bufio.ReadByte немного отличается, но результат должен быть таким же, как bufio.Read в тех случаях, когда основной читатель - os.File , Основное отличие от bufio.Read состоит в том, что bufio.ReadByte может сделать несколько попыток пополнить внутренний буфер. Если во время повторного заполнения возникает ошибка (что будет иметь место для считывателя os.File в EOF), она возвращается после первой ошибочной попытки чтения. Итак, если ваш базовый Reader является читателем os.File, то вы получите 0, io.EOF тогда и только тогда, когда ваш базовый файл находится в EOF. Если ваш базовый считыватель был пользовательским типом считывателя, который возвращал только 0, nil в EOF, то bufio.ReadByte в конечном итоге выдавал бы ошибку «NoProgress». Я не уверен, почему логика повторов есть только в bufio.ReadByte, но хорошая новость заключается в том, что любой из вариантов можно использовать, если ваш базовый файл ведет себя как os.File.

Другая информация:

Это не относится непосредственно к golang, но вам может быть интересен следующий поток: Может читать (2), возвращать ноль байтов, когда не в EOF . Его тема - семантика системного вызова read () (POSIX). Чтение неблокирующих сокетов / файлов, даже когда данные не готовы, должно возвращать -1, а не 0, и устанавливать errno EAGAIN (или EINTR при прерывании). Неблокирующие сокеты / файлы на самом деле не являются родной концепцией (насколько я знаю), и модуль bufio, в частности, будет panic() всякий раз, когда / если основной читатель возвращает отрицательные числа, так что у вас нет беспокоиться об этом.

0
ответ дан init_js 28 March 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: