Функция io.Copy

Функция io.Copy копирует данные из io.Reader в io.Writer до тех пор, пока не будет достигнут конец чтения (EOF) или не произойдет ошибка. Она возвращает количество скопированных байтов и ошибку. В первый параметр мы передаем объект, реализующий интерфейс io.Writer (куда копируем), во второй параметр мы передаем объект, реализующий интерфейс io.Reader (откуда копируем).

В отличие от ручного копирования через цикл, io.Copy использует оптимизированный буфер по умолчанию (32 КБ) и автоматически обрабатывает все возможные ситуации с частичным чтением и записью данных.

Синтаксис

goio.Copy(dst, src)

Где dst - объект, реализующий интерфейс io.Writer, а src - объект, реализующий интерфейс io.Reader. Функция возвращает два значения: количество скопированных байтов (тип int64) и ошибку.

Пример

Давайте скопируем данные из стандартного ввода в стандартный вывод:

gopackage main

import (
  "io"
  "os"
)

func main() {
  _, err := io.Copy(os.Stdout, os.Stdin)
  if err != nil {
    os.Stderr.WriteString("Error: " + err.Error())
  }
}

После запуска программы все введенные данные будут сразу выводиться обратно до нажатия Ctrl+D (или Ctrl+Z на Windows).

Пример

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

gopackage main

import (
  "io"
  "os"
)

func main() {
  srcFile, err := os.Open("input.txt")
  if err != nil {
    panic(err)
  }
  defer srcFile.Close()

  dstFile, err := os.Create("output.txt")
  if err != nil {
    panic(err)
  }
  defer dstFile.Close()

  bytesCopied, err := io.Copy(dstFile, srcFile)
  if err != nil {
    panic(err)
  }

  println("Copied", bytesCopied, "bytes")
}

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

go"Copied 12345 bytes"

Функция скопирует все данные из input.txt в output.txt и вернет точное количество скопированных байтов.

Пример

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

gopackage main

import (
  "bytes"
  "io"
  "strings"
)

func main() {
  reader := strings.NewReader("abcde")
  buffer := &bytes.Buffer{}

  _, err := io.Copy(buffer, reader)
  if err != nil {
    panic(err)
  }

  println(buffer.String())
}

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

go"abcde"

Функция скопировала строку 'abcde' из strings.Reader в bytes.Buffer.

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

  • функцию io.CopyN,
    которая копирует только указанное количество байтов
  • функцию io.CopyBuffer,
    которая копирует данные с использованием пользовательского буфера
  • функцию os.ReadFile,
    которая читает содержимое файла целиком
  • функцию os.WriteFile,
    которая записывает данные в файл целиком