Проблема в том, что os.Stat()
может вернуть error
, который вы пропустите. Когда это случается, fileStat
может быть nil
, поэтому паника вызывает fileStat.Mode()
в следующей строке.
И причина os.Stat()
в том, что file.Name()
относительно root
, * Сам по себе 1013 * имеет мало шансов на существование, его нужно соединить с root
. Если os.Stat()
вызывается с несуществующим именем файла, он возвращает nil
информацию о файле и ошибку, отличную от nil
.
Вы можете использовать filepath.Join()
создать правильный путь для файлов, с которыми os.Stat()
будет работать. И было бы лучше обрабатывать ошибки, например возвращать их, которые вы можете проверить в main()
.
func appendFiles(root string) error {
fileInfo, err := ioutil.ReadDir(root)
if err != nil {
return fmt.Errorf("ReadDir error: %w", err)
}
for _, file := range fileInfo {
files = append(files, filepath.Join(root, file.Name()))
}
for _, file := range fileInfo {
fullName := filepath.Join(root, file.Name())
fileStat, err := os.Stat(fullName)
if err != nil {
return fmt.Errorf("Stat error: %w", err)
}
if fileStat.Mode().IsDir() {
if err := appendFiles(fullName); err != nil {
return fmt.Errorf("appendFiles error: %w", err)
}
}
}
return nil
}
func main() {
if err := appendFiles("."); err != nil {
fmt.Println(err)
}
}