Ошибка io.EOF

Ошибка io.EOF (End Of File) возвращается функциями чтения, когда они пытаются прочитать данные из источника, в котором больше нет доступных данных. Это не критическая ошибка, а стандартный сигнал о том, что данные закончились. В первом параметре функции чтения передается источник данных (например, файл), во второй параметр передается буфер для чтения данных.

Синтаксис

goimport "io"

n, err := r.Read(buf)
if err == io.EOF {
  // данные закончились
}

Пример с чтением из файла

Давайте прочитаем файл целиком и обработаем ошибку io.EOF:

gopackage main

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

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

  buf := make([]byte, 1024)
  for {
    n, err := file.Read(buf)
    if err == io.EOF {
      fmt.Println("End of file reached")
      break
    }
    if err != nil {
      fmt.Println("Error reading file:", err)
      return
    }
    fmt.Print(string(buf[:n]))
  }
}

Результат выполнения кода (если в файле example.txt содержится текст "Hello, World!"):

go"Hello, World!"
"End of file reached"

Пример с использованием io.ReadAll

Функция io.ReadAll читает все данные из источника до тех пор, пока не встретит io.EOF:

gopackage main

import (
  "fmt"
  "io"
  "strings"
)

func main() {
  r := strings.NewReader("12345")
  data, err := io.ReadAll(r)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(string(data))
}

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

go"12345"

Пример с чтением по байтам

При посимвольном чтении также может возникнуть io.EOF:

gopackage main

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

func main() {
  data := []byte("abcde")
  reader := bytes.NewReader(data)

  for {
    b, err := reader.ReadByte()
    if err == io.EOF {
      fmt.Println("EOF")
      break
    }
    if err != nil {
      fmt.Println("Error:", err)
      break
    }
    fmt.Printf("%c ", b)
  }
}

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

go"a b c d e EOF"

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

  • ошибку io.ErrUnexpectedEOF,
    которая возникает при неожиданном окончании данных
  • функцию io.ReadAll,
    которая читает все данные до конца
  • метод os.File.Read,
    который возвращает io.EOF при достижении конца файла
  • функцию io.Copy,
    которая копирует данные до достижения конца источника