Интерфейс io.Writer
Интерфейс io.Writer является фундаментальным абстрактным механизмом
для записи данных в байтовые потоки. Он определяет контракт для всех
сущностей, поддерживающих запись, включая файлы, сетевые соединения,
буферы и многие другие структуры. Основной метод интерфейса -
Write, который принимает срез байтов и возвращает количество
записанных байтов и ошибку.
Синтаксис
Интерфейс io.Writer объявляется следующим образом:
type Writer interface {
Write(p []byte) (n int, err error)
}
Метод Write принимает срез байтов p и пытается записать их
в поток. Возвращает количество записанных байтов и ошибку. Если
записано меньше байтов, чем длина среза, должен быть возвращен
ненулевой код ошибки.
Пример
Давайте запишем строку в стандартный вывод с использованием
интерфейса io.Writer:
package 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)
}
Результат выполнения кода:
"Hello, World!"
"Written 13 bytes"
Пример
Давайте запишем данные в файл с помощью интерфейса
io.Writer:
package 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)
}
Результат выполнения кода:
"Written 22 bytes to file"
Пример
Давайте используем множественный писатель для записи одновременно в несколько потоков:
package 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())
}
Результат выполнения кода:
"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 для закрытия потоков