РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
567 of 1593 menu

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

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

Синтаксис

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

Пример работы с файлом

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

package main import ( "fmt" "io" "os" ) func main() { file, err := os.Create("example.txt") if err != nil { fmt.Println(err) return } defer file.Close() var wc io.WriteCloser = file bytes, err := wc.Write([]byte("Hello, WriteCloser")) if err != nil { fmt.Println(err) return } fmt.Printf("Записано байт: %d\n", bytes) // закрываем явно if err := wc.Close(); err != nil { fmt.Println(err) } }

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

"Записано байт: 19"

Пример с буферизированным писателем

Интерфейс io.WriteCloser может быть реализован и другими типами, например, bufio.Writer, который буферизирует запись, но не имеет метода Close. Обернем его в io.NopCloser для соответствия интерфейсу:

package main import ( "bufio" "fmt" "io" "os" ) func main() { file, err := os.Create("buffered.txt") if err != nil { fmt.Println(err) return } defer file.Close() bufWriter := bufio.NewWriter(file) var wc io.WriteCloser = io.NopCloser(bufWriter) _, err = wc.Write([]byte("Buffered write")) if err != nil { fmt.Println(err) return } if err := bufWriter.Flush(); err != nil { fmt.Println(err) } if err := wc.Close(); err != nil { fmt.Println(err) } fmt.Println("Данные записаны") }

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

"Данные записаны"

Пример с сетевым соединением

Рассмотрим использование io.WriteCloser с сетевым подключением:

package main import ( "fmt" "io" "net" ) func main() { conn, err := net.Dial("tcp", "example.com:80") if err != nil { fmt.Println(err) return } defer conn.Close() var wc io.WriteCloser = conn _, err = wc.Write([]byte("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")) if err != nil { fmt.Println(err) return } if err := wc.Close(); err != nil { fmt.Println(err) return } fmt.Println("Запрос отправлен") }

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

"Запрос отправлен"

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

  • интерфейс io.Writer,
    предназначенный для записи данных
  • интерфейс io.Closer,
    предназначенный для закрытия ресурсов
  • интерфейс io.ReadCloser,
    объединяющий чтение и закрытие
  • функцию io.NopCloser,
    возвращающую WriteCloser без операции закрытия
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить