Показаны сообщения с ярлыком интерфейс io.Writer в Go. Показать все сообщения
Показаны сообщения с ярлыком интерфейс io.Writer в Go. Показать все сообщения

суббота, 18 июля 2020 г.

Пакет io в Golang, запись

Функция WriteString

func WriteString(w Writer, s string) (n int, err error)

WriteString записывает содержимое строки s в w, которая принимает часть байтов. Если w реализует StringWriter, его метод WriteString вызывается напрямую. В противном случае w.Write вызывается ровно один раз.

package main

import (
    "io"
    "os"
)

func main() {
    io.WriteString(os.Stdout, "Hello World")

}

Вывод:

Hello World

Интерфейс Writer

Writer - это интерфейс, который оборачивает базовый метод Write.

type Writer interface {
    Write(p []byte) (n int, err error)
}

Write записывает len(p) байтов из p в подлежащий поток данных. Он возвращает количество байтов, записанных из p (0 <= n <= len(p)), и любую обнаруженную ошибку, которая привела к преждевременной остановке записи. Write должен возвращать ошибку, отличную от nil, если он возвращает n < len(p). Write не должен изменять данные среза, даже временно.

Реализации не должны сохранять p.

Функция MultiWriter

func MultiWriter(writers ...Writer) Writer

MultiWriter создает writer, который дублирует свои записи всем предоставленным writer, аналогично команде Unix tee(1).

Каждая запись пишется каждому из перечисленных writer по одному. Если перечисленный writer возвращает ошибку, эта операция записи останавливается и возвращает ошибку; это не продолжается вниз по списку.

package main

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

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

    var buf1, buf2 bytes.Buffer
    w := io.MultiWriter(&buf1, &buf2)

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

    fmt.Print(buf1.String())
    fmt.Print(buf2.String())

}

Вывод:

some io.Reader stream to be read
some io.Reader stream to be read


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


пятница, 15 мая 2020 г.

Как использовать интерфейс io.Writer в Golang

Интерфейс io.Writer представляет объект, в который вы можете записать поток байтов.

type Writer interface {
    Write(p []byte) (n int, err error)
}

Write записывает до len(p) байтов из p в подлежащий поток данных - он возвращает количество записанных байтов и обнаруженную ошибку, которая привела к преждевременной остановке записи.

Стандартная библиотека предоставляет множество реализаций Writer, и Writers принимаются в качестве входных данных многими утилитами.

Как использовать встроенный writer

В качестве первого примера вы можете записать непосредственно в bytes.Buffer, используя функцию fmt.Fprintf. Это работает поскольку

  • bytes.Buffer имеет метод Write и
  • fmt.Fprintf принимает Writer в качестве первого аргумента.

var buf bytes.Buffer
fmt.Fprintf(&buf, "Size: %d MB.", 85)
s := buf.String()) // s == "Size: 85 MB."

Точно так же вы можете записывать напрямую в файлы или другие потоки, такие как http-соединения.

Это очень распространенный паттерн в Go. В качестве еще одного примера вы можете вычислить значение хэш-функции файла, скопировав файл в функцию io.Writer подходящего объекта hash.Hash.

Оптимизировать запись строк

Некоторые Writers в стандартной библиотеке имеют дополнительный метод WriteString. Этот метод может быть более эффективным, чем стандартный метод Write, так как он записывает строку напрямую, без выделения среза байтов.

Вы можете напрямую воспользоваться этой оптимизацией, используя функцию io.WriteString().

func WriteString(w Writer, s string) (n int, err error)

Если w реализует метод WriteString, он вызывается напрямую. В противном случае w.Write вызывается ровно один раз.


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