Функция io.Copy
Функция io.Copy копирует данные из io.Reader в io.Writer до тех пор, пока не будет достигнут конец чтения (EOF) или не произойдет ошибка. Она возвращает количество скопированных байтов и ошибку. В первый параметр мы передаем объект, реализующий интерфейс io.Writer (куда копируем), во второй параметр мы передаем объект, реализующий интерфейс io.Reader (откуда копируем).
В отличие от ручного копирования через цикл, io.Copy использует оптимизированный буфер по умолчанию (32 КБ) и автоматически обрабатывает все возможные ситуации с частичным чтением и записью данных.
Синтаксис
io.Copy(dst, src)
Где dst - объект, реализующий интерфейс io.Writer, а src - объект, реализующий интерфейс io.Reader. Функция возвращает два значения: количество скопированных байтов (тип int64) и ошибку.
Пример
Давайте скопируем данные из стандартного ввода в стандартный вывод:
package 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).
Пример
Давайте скопируем содержимое одного файла в другой:
package 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")
}
Результат выполнения кода при успешном копировании:
"Copied 12345 bytes"
Функция скопирует все данные из input.txt в output.txt и вернет точное количество скопированных байтов.
Пример
Давайте скопируем данные из строки в буфер:
package 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())
}
Результат выполнения кода:
"abcde"
Функция скопировала строку 'abcde' из strings.Reader в bytes.Buffer.
Смотрите также
-
функцию
io.CopyN,
которая копирует только указанное количество байтов -
функцию
io.CopyBuffer,
которая копирует данные с использованием пользовательского буфера -
функцию
os.ReadFile,
которая читает содержимое файла целиком -
функцию
os.WriteFile,
которая записывает данные в файл целиком