Интерфейс io.Reader
Интерфейс io.Reader представляет любой источник данных,
из которого можно читать байты. Этот интерфейс используется
повсеместно в стандартной библиотеке Go для работы с файлами,
сетевыми соединениями, строками, буферами и другими потоками
данных. Основной метод интерфейса — Read, который
принимает в качестве аргумента байтовый срез и возвращает
количество прочитанных байтов и ошибку.
Метод Read считывает данные в переданный срез
p и возвращает количество прочитанных байтов
n. Если достигнут конец данных, метод возвращает
ошибку io.EOF. Важно отметить, что метод может
вернуть меньше байтов, чем размер среза, даже если данные
еще не закончились.
Синтаксис
type Reader interface {
Read(p []byte) (n int, err error)
}
Пример
Давайте прочитаем данные из строки с помощью
strings.NewReader, который возвращает
io.Reader:
package main
import (
"fmt"
"io"
"strings"
)
func main() {
r := strings.NewReader("abcde")
buf := make([]byte, 2)
for {
n, err := r.Read(buf)
if err == io.EOF {
break
}
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%s", string(buf[:n]))
}
}
Результат выполнения кода:
"abcde"
Пример
Прочитаем данные из файла с помощью os.Open,
который возвращает *os.File, реализующий
io.Reader:
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("test.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
buf := make([]byte, 5)
for {
n, err := file.Read(buf)
if err == io.EOF {
break
}
if err != nil {
fmt.Println(err)
return
}
fmt.Print(string(buf[:n]))
}
}
Результат выполнения кода:
"Hello, World!"
Пример
Используем функцию io.ReadAll для чтения всех данных
из io.Reader в один срез байтов:
package main
import (
"fmt"
"io"
"strings"
)
func main() {
r := strings.NewReader("12345")
data, err := io.ReadAll(r)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%s", data)
}
Результат выполнения кода:
"12345"
Смотрите также
-
интерфейс
io.Writer,
который используется для записи данных в поток -
интерфейс
io.Closer,
который предоставляет метод Close для закрытия ресурсов -
функцию
io.ReadAll,
которая читает все данные из Reader до EOF -
функцию
io.Copy,
которая копирует данные из Reader в Writer