Функция io.CopyBuffer
Функция io.CopyBuffer копирует данные из io.Reader в io.Writer,
используя предоставленный буфер. В первый параметр передается ридер
(источник данных), во второй — райтер (приемник данных), а в третий
— срез байтов (буфер), который будет использоваться для копирования.
Функция возвращает количество скопированных байтов и ошибку.
Если буфер равен nil, функция создает буфер стандартного размера.
Синтаксис
io.CopyBuffer(dst io.Writer, src io.Reader, buf []byte) (written int64, err error)
Пример
Давайте скопируем данные из строки в буфер с использованием пользовательского буфера размером 10 байт:
package 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())
}
Результат выполнения кода:
"Written bytes: 15"
"Result: 1234567890abcde"
Пример
Давайте скопируем данные из файла в другой файл, используя буфер большего размера для повышения производительности:
package 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")
}
Если файлы существуют и доступны для чтения/записи, результат выполнения кода:
"Copied 1024 bytes"
Пример
Давайте используем io.CopyBuffer с нулевым буфером,
чтобы увидеть, как функция создает собственный буфер:
package 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())
}
Результат выполнения кода:
"Written: 5"
"Result: abcde"