среда, 15 июля 2020 г.

Пакет io в Golang, функции копирования

Функция Copy

func Copy(dst Writer, src Reader) (written int64, err error)

Copy копирует из src в dst, пока на src не будет достигнут EOF или пока не произойдет ошибка. Возвращает количество скопированных байтов и первую ошибку, обнаруженную при копировании, если таковые имеются.

При успешном копировании возвращается err == nil, а не err == EOF. Поскольку копирование определено для чтения из src до EOF, оно не рассматривает EOF из чтения как ошибку, о которой будет сообщено.

Если src реализует интерфейс WriterTo, копия реализуется путем вызова src.WriteTo(dst). В противном случае, если dst реализует интерфейс ReaderFrom, копия реализуется путем вызова dst.ReadFrom(src).

package main

import (
    "io"
    "log"
    "os"
    "strings"
)

func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")

    if _, err := io.Copy(os.Stdout, r); err != nil {
        log.Fatal(err)
    }

}

Вывод:

some io.Reader stream to be read

Функция CopyBuffer

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

CopyBuffer идентичен Copy, за исключением того, что он поэтапно использует предоставленный буфер (если он необходим), а не выделяет временный. Если buf равен nil, выделяется один новый; в противном случае, если он имеет нулевую длину, CopyBuffer паникует.

Если src реализует WriterTo или dst реализует ReaderFrom, buf не будет использоваться для выполнения копирования.

package main

import (
    "io"
    "log"
    "os"
    "strings"
)

func main() {
    r1 := strings.NewReader("first reader\n")
    r2 := strings.NewReader("second reader\n")
    buf := make([]byte, 8)

    // buf используется здесь...
    if _, err := io.CopyBuffer(os.Stdout, r1, buf); err != nil {
        log.Fatal(err)
    }

    // ... переиспользуется также здесь. 
    // Нет необходимости выделять дополнительный буфер.
    if _, err := io.CopyBuffer(os.Stdout, r2, buf); err != nil {
        log.Fatal(err)
    }

}

Вывод:

first reader
second reader

Функция CopyN

func CopyN(dst Writer, src Reader, n int64) (written int64, err error)

CopyN копирует n байтов (или до ошибки) из src в dst. Возвращает количество скопированных байтов и самую раннюю ошибку, возникшую при копировании. По возвращении written == n только тогда, когда err == nil.

Если dst реализует интерфейс ReaderFrom, копия реализуется с его помощью.

package main

import (
    "io"
    "log"
    "os"
    "strings"
)

func main() {
    r := strings.NewReader("some io.Reader stream to be read")

    if _, err := io.CopyN(os.Stdout, r, 5); err != nil {
        log.Fatal(err)
    }

}

Вывод:

some 


Читайте также:


Комментариев нет:

Отправить комментарий