Интерфейс io.ByteReader
Интерфейс io.ByteReader предназначен для чтения одного байта из потока данных. Он определяет метод ReadByte, который возвращает следующий байт из источника данных или ошибку, если достигнут конец файла или произошла другая ошибка. Этот интерфейс часто используется при работе с файлами, сетевыми соединениями и другими источниками данных, где требуется посимвольное чтение.
Синтаксис
type ByteReader interface {
ReadByte() (byte, error)
}
Метод ReadByte возвращает два значения: прочитанный байт и ошибку. Если чтение прошло успешно, ошибка будет равна nil. Если достигнут конец данных, метод возвращает io.EOF. В случае других ошибок возвращается соответствующая ошибка.
Пример
Давайте создадим файл и прочитаем из него байты с помощью интерфейса io.ByteReader:
package main
import (
"io"
"os"
)
func main() {
file, err := os.Open("test.txt")
if err != nil {
panic(err)
}
defer file.Close()
var reader io.ByteReader = file
b, err := reader.ReadByte()
if err != nil {
panic(err)
}
println(string(b))
}
Результат выполнения кода при содержимом файла "test.txt" со строкой "abc":
"a"
Пример
Давайте прочитаем все байты из строки с помощью интерфейса io.ByteReader:
package main
import (
"io"
"strings"
)
func main() {
r := strings.NewReader("abcde")
var reader io.ByteReader = r
for {
b, err := reader.ReadByte()
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
print(string(b))
}
println()
}
Результат выполнения кода:
"abcde"
Пример
Давайте продемонстрируем обработку ошибок при чтении байтов:
package main
import (
"io"
"strings"
)
func main() {
r := strings.NewReader("123")
var reader io.ByteReader = r
for i := 0; i < 4; i++ {
b, err := reader.ReadByte()
if err != nil {
if err == io.EOF {
println("достигнут конец данных")
} else {
println("ошибка:", err.Error())
}
continue
}
println("прочитан байт:", string(b))
}
}
Результат выполнения кода:
"прочитан байт: 1"
"прочитан байт: 2"
"прочитан байт: 3"
"достигнут конец данных"
Смотрите также
-
интерфейс
io.ByteWriter,
который предоставляет метод для записи одного байта -
интерфейс
io.RuneReader,
который позволяет читать Unicode-символы из потока -
интерфейс
io.Reader,
который предоставляет метод для чтения данных в буфер -
функцию
io.ReadAll,
которая читает все данные из потока до конца