Функция io.CopyBuffer

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

Синтаксис

goio.CopyBuffer(dst io.Writer, src io.Reader, buf []byte) (written int64, err error)

Пример

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

gopackage main

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

func main() {
  src := strings.NewReader("1234567890abcde")
  dst := &bytes.Buffer{}
  buf := make([]byte, 10)

  written, err := io.CopyBuffer(dst, src, buf)
  if err != nil {
    fmt.Println("Error:", err)
  }

  fmt.Println("Written bytes:", written)
  fmt.Println("Result:", dst.String())
}

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

go"Written bytes: 15"
"Result: 1234567890abcde"

Пример

Давайте скопируем данные из файла в другой файл, используя буфер большего размера для повышения производительности:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  src, err := os.Open("input.txt")
  if err != nil {
    fmt.Println("Error opening source:", err)
    return
  }
  defer src.Close()

  dst, err := os.Create("output.txt")
  if err != nil {
    fmt.Println("Error creating destination:", err)
    return
  }
  defer dst.Close()

  buf := make([]byte, 64*1024) // 64 KB buffer
  written, err := io.CopyBuffer(dst, src, buf)
  if err != nil {
    fmt.Println("Error copying:", err)
  }

  fmt.Println("Copied", written, "bytes")
}

Если файлы существуют и доступны для чтения/записи, результат выполнения кода:

go"Copied 1024 bytes"

Пример

Давайте используем io.CopyBuffer с нулевым буфером, чтобы увидеть, как функция создает собственный буфер:

gopackage main

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

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

  written, err := io.CopyBuffer(dst, src, nil)
  if err != nil {
    fmt.Println("Error:", err)
  }

  fmt.Println("Written:", written)
  fmt.Println("Result:", dst.String())
}

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

go"Written: 5"
"Result: abcde"

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

  • функцию io.Copy,
    которая копирует данные с использованием стандартного буфера
  • функцию io.CopyN,
    которая копирует ровно указанное количество байт
  • интерфейс io.Reader,
    который представляет источник данных для чтения
  • интерфейс io.Writer,
    который представляет приемник данных для записи