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

Ошибка io.ErrClosedPipe

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

Синтаксис

var ErrClosedPipe = errors.New("io: read/write on closed pipe")

Ошибка возвращается в качестве значения типа error при попытке чтения или записи в закрытый канал.

Пример

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

package main import ( "fmt" "io" ) func main() { // Создаем синхронный канал reader, writer := io.Pipe() // Закрываем канал для записи writer.Close() // Пытаемся записать данные в закрытый канал _, err := writer.Write([]byte("data")) if err != nil { fmt.Println(err) } }

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

"io: read/write on closed pipe"

Пример

Рассмотрим ситуацию, когда одна горутина закрывает канал, а другая пытается читать из него:

package main import ( "fmt" "io" ) func main() { // Создаем канал reader, writer := io.Pipe() // Запускаем горутину для записи go func() { writer.Write([]byte("hello")) writer.Close() }() // Читаем данные из канала buf := make([]byte, 1024) n, err := reader.Read(buf) if err == io.ErrClosedPipe { fmt.Println("Канал был закрыт до завершения чтения") } else { fmt.Printf("Прочитано %d байт: %s\n", n, string(buf[:n])) } }

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

"Прочитано 5 байт: hello"

Пример

Пример обработки ошибки при чтении из закрытого канала с использованием цикла:

package main import ( "fmt" "io" ) func main() { // Создаем канал reader, writer := io.Pipe() // Записываем данные и закрываем канал writer.Write([]byte("12345")) writer.Close() // Пытаемся прочитать данные из закрытого канала buf := make([]byte, 3) for { n, err := reader.Read(buf) if err != nil { if err == io.ErrClosedPipe { fmt.Println("Канал закрыт, чтение завершено") } else { fmt.Printf("Ошибка: %v\n", err) } break } fmt.Printf("Прочитано %d байт: %s\n", n, string(buf[:n])) } }

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

"Прочитано 3 байт: 123" "Прочитано 2 байт: 45" "Канал закрыт, чтение завершено"

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

  • функцию io.Pipe,
    которая создает синхронный канал для передачи данных
  • метод os.File.Close,
    который закрывает файл
  • ошибку os.ErrClosed,
    которая возникает при работе с закрытым файлом
  • интерфейс io.Closer,
    который предоставляет метод Close
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить