Интерфейс fs.ReadFileFS

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

Синтаксис

gotype ReadFileFS interface {
  FS
  ReadFile(name string) ([]byte, error)
}

Метод ReadFile принимает строку name - имя файла (путь относительно корня файловой системы) и возвращает срез байт с содержимым файла и ошибку. Если файл не существует или произошла другая ошибка, метод вернет nil и ошибку.

Пример

Давайте прочитаем содержимое файла "example.txt" с помощью интерфейса fs.ReadFileFS. Для этого создадим тестовую файловую систему с этим файлом:

gopackage main

import (
  "fmt"
  "io/fs"
  "testing/fstest"
)

func main() {
  // Создаем тестовую файловую систему с файлом "example.txt"
  testFS := fstest.MapFS{
    "example.txt": &fstest.MapFile{
      Data: []byte("Hello, World!"),
    },
  }

  // Проверяем, что файловая система реализует интерфейс fs.ReadFileFS
  if readFileFS, ok := testFS.(fs.ReadFileFS); ok {
    // Читаем содержимое файла
    data, err := readFileFS.ReadFile("example.txt")
    if err != nil {
      fmt.Println("Error:", err)
      return
    }
    fmt.Println(string(data))
  } else {
    fmt.Println("fs does not implement fs.ReadFileFS")
  }
}

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

go"Hello, World!"

Пример

Если файл не существует, метод ReadFile вернет ошибку. Давайте попробуем прочитать несуществующий файл:

gopackage main

import (
  "fmt"
  "io/fs"
  "testing/fstest"
)

func main() {
  // Создаем пустую тестовую файловую систему
  testFS := fstest.MapFS{}

  // Проверяем, что файловая система реализует интерфейс fs.ReadFileFS
  if readFileFS, ok := testFS.(fs.ReadFileFS); ok {
    // Пытаемся прочитать несуществующий файл
    data, err := readFileFS.ReadFile("missing.txt")
    if err != nil {
      fmt.Println("Error:", err)
      return
    }
    fmt.Println(string(data))
  } else {
    fmt.Println("fs does not implement fs.ReadFileFS")
  }
}

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

go"Error: open missing.txt: file does not exist"

Пример

Интерфейс fs.ReadFileFS удобно использовать для работы с встраиваемыми файловыми системами. Например, с пакетом embed:

gopackage main

import (
  "embed"
  "fmt"
  "io/fs"
)

//go:embed example.txt
var embeddedFS embed.FS

func main() {
  // Проверяем, что встраиваемая файловая система реализует интерфейс fs.ReadFileFS
  if readFileFS, ok := embeddedFS.(fs.ReadFileFS); ok {
    // Читаем содержимое файла
    data, err := readFileFS.ReadFile("example.txt")
    if err != nil {
      fmt.Println("Error:", err)
      return
    }
    fmt.Println(string(data))
  } else {
    fmt.Println("fs does not implement fs.ReadFileFS")
  }
}

Результат выполнения кода (при наличии файла "example.txt" в директории):

go"Hello, World!"

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

  • интерфейс fs.FS,
    который является базовым интерфейсом для всех файловых систем
  • функцию fs.ReadFile,
    которая упрощает чтение файла из любой файловой системы
  • интерфейс fs.ReadDirFS,
    который предоставляет метод для чтения содержимого директории
  • функцию os.ReadFile,
    которая читает содержимое файла из операционной системы