Ошибка os.ErrClosed

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

Синтаксис

goos.ErrClosed

Пример

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

gopackage main

import (
  "fmt"
  "os"
)

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

  err = file.Close()
  if err != nil {
    fmt.Println(err)
    return
  }

  _, err = file.WriteString("hello")
  if err != nil {
    fmt.Println(err)
  }
}

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

go"write example.txt: file already closed"

Пример

Рассмотрим пример чтения из закрытого файла:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  file, err := os.Open("example.txt")
  if err != nil {
    fmt.Println(err)
    return
  }

  err = file.Close()
  if err != nil {
    fmt.Println(err)
    return
  }

  buf := make([]byte, 10)
  _, err = file.Read(buf)
  if err != nil {
    fmt.Println(err)
  }
}

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

go"read example.txt: file already closed"

Пример

Правильный подход - всегда проверять ошибки при работе с файлами и использовать отложенный вызов Close:

gopackage main

import (
  "fmt"
  "os"
)

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

  _, err = file.WriteString("hello")
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Println("success")
}

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

go"success"

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

  • ошибку os.ErrNotExist,
    которая возникает при попытке открыть несуществующий файл
  • ошибку os.ErrPermission,
    которая возникает при недостатке прав доступа
  • метод os.File.Close,
    который закрывает файловый дескриптор
  • ошибку os.ErrExist,
    которая возникает при попытке создать уже существующий файл