Интерфейс io.Writer

Интерфейс io.Writer является фундаментальным абстрактным механизмом для записи данных в байтовые потоки. Он определяет контракт для всех сущностей, поддерживающих запись, включая файлы, сетевые соединения, буферы и многие другие структуры. Основной метод интерфейса - Write, который принимает срез байтов и возвращает количество записанных байтов и ошибку.

Синтаксис

Интерфейс io.Writer объявляется следующим образом:

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

Метод Write принимает срез байтов p и пытается записать их в поток. Возвращает количество записанных байтов и ошибку. Если записано меньше байтов, чем длина среза, должен быть возвращен ненулевой код ошибки.

Пример

Давайте запишем строку в стандартный вывод с использованием интерфейса io.Writer:

gopackage main

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

func main() {
  message := "Hello, World!"
  bytes := []byte(message)
  
  n, err := io.WriteString(os.Stdout, string(bytes))
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Printf("\nWritten %d bytes", n)
}

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

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

Пример

Давайте запишем данные в файл с помощью интерфейса io.Writer:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  file, err := os.Create("example.txt")
  if err != nil {
    fmt.Println("Error creating file:", err)
    return
  }
  defer file.Close()

  data := []byte("Data to write to file")
  n, err := file.Write(data)
  if err != nil {
    fmt.Println("Error writing to file:", err)
    return
  }
  fmt.Printf("Written %d bytes to file", n)
}

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

go"Written 22 bytes to file"

Пример

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

gopackage main

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

func main() {
  buf := bytes.NewBufferString("")
  writer := io.MultiWriter(os.Stdout, buf)
  
  message := "Multi-writer example"
  bytes := []byte(message)
  
  n, err := writer.Write(bytes)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  
  fmt.Printf("Written %d bytes\n", n)
  fmt.Printf("Buffer content: %s", buf.String())
}

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

go"Multi-writer example"
"Written 20 bytes"
"Buffer content: Multi-writer example"

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

  • интерфейс io.Reader,
    который определяет контракт для чтения данных из потоков
  • функцию io.WriteString,
    которая упрощает запись строк в реализацию io.Writer
  • функцию io.MultiWriter,
    которая создает писатель, дублирующий запись в несколько потоков
  • интерфейс io.WriteCloser,
    который объединяет io.Writer с io.Closer для закрытия потоков