пятница, 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 вызывается ровно один раз.


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


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

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