Функция io.CopyN
Функция io.CopyN копирует ровно указанное количество байт
из io.Reader (источник) в io.Writer (приемник).
В первый параметр передается приемник, во второй — источник,
в третий — количество байт, которое необходимо скопировать.
Функция возвращает количество скопированных байт и ошибку,
если она возникла.
Особенность io.CopyN заключается в том, что она требует
копирования строго заданного числа байт. Если источник содержит
меньше байт, чем запрошено, функция вернет ошибку io.EOF.
Если при копировании происходит ошибка, функция возвращает
количество успешно скопированных байт и ошибку.
Синтаксис
io.CopyN(writer, reader, n)
Пример с файлами
Давайте скопируем 10 байт из одного файла в другой:
package main
import (
"io"
"os"
)
func main() {
src, err := os.Open("source.txt")
if err != nil {
panic(err)
}
defer src.Close()
dst, err := os.Create("dest.txt")
if err != nil {
panic(err)
}
defer dst.Close()
n, err := io.CopyN(dst, src, 10)
if err != nil {
panic(err)
}
println(n, "bytes copied")
}
Результат выполнения кода:
"10 bytes copied"
Пример с ошибкой EOF
Попробуем скопировать больше байт, чем есть в источнике:
package main
import (
"io"
"os"
)
func main() {
src, err := os.Open("small.txt")
if err != nil {
panic(err)
}
defer src.Close()
dst, err := os.Create("output.txt")
if err != nil {
panic(err)
}
defer dst.Close()
n, err := io.CopyN(dst, src, 100)
if err != nil {
println("Error:", err.Error())
}
println(n, "bytes copied")
}
Результат выполнения кода:
"Error: EOF"
"5 bytes copied"
Пример со строкой
Скопируем 5 байт из строки с использованием strings.NewReader:
package main
import (
"io"
"os"
"strings"
)
func main() {
reader := strings.NewReader("abcdefghijklmnopqrstuvwxyz")
writer := os.Stdout
n, err := io.CopyN(writer, reader, 5)
if err != nil {
panic(err)
}
println(n, "bytes copied")
}
Результат выполнения кода:
"abcde"
"5 bytes copied"
Смотрите также
-
функцию
io.Copy,
которая копирует все данные из источника в приемник до достижения EOF -
функцию
io.CopyBuffer,
которая копирует данные с использованием указанного буфера -
функцию
io.ReadAll,
которая считывает все данные из источника в байтовый срез -
функцию
io.LimitReader,
которая создает читателя, ограничивающего чтение заданным количеством байт