💬 Опишите основные возможности и пример использования пакета io/fs, добавленного в Go 1.16.



io/fs предлагает интерфейс файловой системы FS, доступный только для чтения. embed.FS реализует интерфейс fs.FS, что дает возможность пользоваться некоторыми функциональными возможностями пакета io/fs.



Следовательно, наши приложения могут создавать собственные внутренние файловые системы и работать с их файлами.



📌 Простой пример:



func list(f embed.FS) error {

return fs.WalkDir(f, ".", walkFunction)

}



func walkFunction(path string, d fs.DirEntry, err error) error {

if err != nil {

return err

}

fmt.Printf("Path=%q, isDir=%v\n", path, d.IsDir())

return nil

}



func extract(f embed.FS, filepath string) ([]byte, error) {

s, err := fs.ReadFile(f, filepath)

if err != nil {

return nil, err

}

return s, nil

}





Функция ReadFile() используется для извлечения файла, который идентифицируется по пути к файлу, из файловой системы embed.FS в виде байтового среза, возвращаемого из функции extract().



func walkSearch(path string, d fs.DirEntry, err error) error {

if err != nil {

return err

}

if d.Name() == searchString {





searchString — это глобальная переменная, которая содержит строку поиска. Когда совпадение найдено, соответствующий путь выводится на экран.



        fileInfo, err := fs.Stat(f, path)

if err != nil {

return err

}

fmt.Println("Found", path, "with size", fileInfo.Size())

return nil

}





Прежде чем выводить совпадение, мы вызываем fs.Stat() с целью получить о нем более подробную информацию.



    return nil 

}