Функция io.CopyN

Функция io.CopyN копирует ровно указанное количество байт из io.Reader (источник) в io.Writer (приемник). В первый параметр передается приемник, во второй — источник, в третий — количество байт, которое необходимо скопировать. Функция возвращает количество скопированных байт и ошибку, если она возникла.

Особенность io.CopyN заключается в том, что она требует копирования строго заданного числа байт. Если источник содержит меньше байт, чем запрошено, функция вернет ошибку io.EOF. Если при копировании происходит ошибка, функция возвращает количество успешно скопированных байт и ошибку.

Синтаксис

goio.CopyN(writer, reader, n)

Пример с файлами

Давайте скопируем 10 байт из одного файла в другой:

gopackage 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")
}

Результат выполнения кода:

go"10 bytes copied"

Пример с ошибкой EOF

Попробуем скопировать больше байт, чем есть в источнике:

gopackage 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")
}

Результат выполнения кода:

go"Error: EOF"
"5 bytes copied"

Пример со строкой

Скопируем 5 байт из строки с использованием strings.NewReader:

gopackage 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")
}

Результат выполнения кода:

go"abcde"
"5 bytes copied"

Смотрите также

  • функцию io.Copy,
    которая копирует все данные из источника в приемник до достижения EOF
  • функцию io.CopyBuffer,
    которая копирует данные с использованием указанного буфера
  • функцию io.ReadAll,
    которая считывает все данные из источника в байтовый срез
  • функцию io.LimitReader,
    которая создает читателя, ограничивающего чтение заданным количеством байт