Интерфейс fs.GlobFS
Интерфейс fs.GlobFS представляет собой файловую систему,
которая поддерживает поиск файлов и директорий по шаблону
(glob pattern). Он включает один метод Glob,
который принимает шаблон для поиска и возвращает список
имен файлов, соответствующих этому шаблону, или ошибку.
Этот интерфейс полезен, когда нужно найти все файлы,
удовлетворяющие определенному шаблону, например, все
файлы с расширением .go или все файлы,
начинающиеся с определенного префикса.
Синтаксис
type GlobFS interface {
Glob(pattern string) ([]string, error)
}
Метод Glob принимает строку с шаблоном и возвращает
срез строк с именами файлов, которые соответствуют шаблону.
Если ни один файл не соответствует шаблону, возвращается
пустой срез и ошибка nil. В случае ошибки поиска
возвращается nil и ошибка.
Пример использования с os.DirFS
Давайте создадим файловую систему с помощью os.DirFS
и найдем все файлы с расширением .txt в текущей
директории:
package main
import (
"fmt"
"os"
)
func main() {
fsys := os.DirFS(".")
matches, err := fsys.(interface{ Glob(string) ([]string, error) }).Glob("*.txt")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(matches)
}
Результат выполнения кода:
["file1.txt" "file2.txt" "notes.txt"]
В этом примере мы используем приведение типа для вызова
метода Glob, так как os.DirFS реализует
интерфейс fs.GlobFS.
Пример с различными шаблонами
Давайте используем разные шаблоны для поиска файлов в директории:
package main
import (
"fmt"
"os"
)
func main() {
fsys := os.DirFS("testdata")
patterns := []string{"*.go", "test_*", "*_test.go", "data[0-9].txt"}
for _, pattern := range patterns {
matches, err := fsys.(interface{ Glob(string) ([]string, error) }).Glob(pattern)
if err != nil {
fmt.Printf("Pattern %q: error - %v\n", pattern, err)
continue
}
fmt.Printf("Pattern %q: %v\n", pattern, matches)
}
}
Результат выполнения кода:
Pattern "*.go": ["main.go" "utils.go"]
Pattern "test_*": ["test_main.go" "test_utils.go"]
Pattern "*_test.go": ["main_test.go" "utils_test.go"]
Pattern "data[0-9].txt": ["data1.txt" "data2.txt"]
Этот пример демонстрирует, как различные шаблоны могут использоваться для гибкого поиска файлов.
Пример обработки ошибок
Давайте рассмотрим, как обрабатывать ошибки при использовании
метода Glob:
package main
import (
"fmt"
"os"
)
func main() {
fsys := os.DirFS("/nonexistent/directory")
matches, err := fsys.(interface{ Glob(string) ([]string, error) }).Glob("*.txt")
if err != nil {
fmt.Println("Error occurred:", err)
return
}
if len(matches) == 0 {
fmt.Println("No files found")
return
}
fmt.Println("Found files:", matches)
}
Результат выполнения кода:
"Error occurred: open /nonexistent/directory: no such file or directory"
В этом примере мы пытаемся выполнить поиск в несуществующей директории, что приводит к ошибке.
Смотрите также
-
интерфейс
fs.FS,
который является базовым интерфейсом для файловых систем -
функцию
fs.Glob,
которая упрощает поиск по шаблону без явного приведения типов -
интерфейс
fs.ReadDirFS,
который добавляет поддержку чтения директорий -
интерфейс
fs.ReadFileFS,
который добавляет поддержку чтения файлов