Функция io.MultiWriter

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

Синтаксис

gofunc MultiWriter(writers ...io.Writer) io.Writer

Пример

Давайте создадим составной писатель, который записывает данные одновременно в файл и в стандартный вывод:

gopackage main

import (
  "fmt"
  "io"
  "os"
)

func main() {
  file, err := os.Create("output.txt")
  if err != nil {
    fmt.Println("Error creating file:", err)
    return
  }
  defer file.Close()
  
  mw := io.MultiWriter(file, os.Stdout)
  
  message := "Hello, world!"
  n, err := mw.Write([]byte(message))
  if err != nil {
    fmt.Println("Error writing:", err)
    return
  }
  
  fmt.Printf("\nWritten %d bytes", n)
}

Результат выполнения кода:

go"Hello, world!"
"Written 13 bytes"

Пример

Давайте используем io.MultiWriter для записи в несколько буферов одновременно:

gopackage main

import (
  "bytes"
  "fmt"
  "io"
)

func main() {
  buf1 := &bytes.Buffer{}
  buf2 := &bytes.Buffer{}
  
  mw := io.MultiWriter(buf1, buf2)
  
  mw.Write([]byte("abcde"))
  
  fmt.Println(buf1.String())
  fmt.Println(buf2.String())
}

Результат выполнения кода:

go"abcde"
"abcde"

Пример

Давайте рассмотрим случай, когда один из писателей возвращает ошибку:

gopackage main

import (
  "bytes"
  "fmt"
  "io"
)

type errorWriter struct{}

func (ew errorWriter) Write(p []byte) (int, error) {
  return 0, fmt.Errorf("write error")
}

func main() {
  buf := &bytes.Buffer{}
  ew := errorWriter{}
  
  mw := io.MultiWriter(buf, ew)
  
  _, err := mw.Write([]byte("abcde"))
  if err != nil {
    fmt.Println("Error:", err)
  }
  
  fmt.Println(buf.String())
}

Результат выполнения кода:

go"Error: write error"
""

Смотрите также

  • функцию io.MultiReader,
    которая объединяет несколько ридеров в один
  • функцию io.TeeReader,
    которая дублирует данные во время чтения
  • функцию io.Copy,
    которая копирует данные из ридера в писатель
  • функцию io.WriteString,
    которая записывает строку в писатель