Обратите внимание, что «Walk не следует по символическим ссылкам», поэтому, если вы хотите написать функцию, которая делает это, я рекомендую ioutil.ReadDir . Мой собственный тест показал, что он быстрее и потребляет меньше памяти, чем filepath.Glob .
Кроме того, ioutil.ReadDir
файлы сортируются по базовому имени с помощью простого сравнения строк ( strA > strB
). Как парень DevOps, я обычно сортирую имена каталогов, выполняя обратное числовое сравнение (например, сначала последняя сборка). Если это также ваш случай, то лучше вызвать os.ReadDir напрямую ( ioutil.ReadDir
вызывает это из-под обложек) и выполнить сортировку самостоятельно.
Вот пример ReadDir
детали с числовой сортировкой:
// ReadDirNumSort - Same as ioutil/ReadDir but uses returns a Numerically
// Sorted file list.
//
// Taken from https://golang.org/src/io/ioutil/ioutil.go
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
// Modified Sort method to use Numerically sorted names instead.
// It also allows reverse sorting.
func ReadDirNumSort(dirname string, reverse bool) ([]os.FileInfo, error) {
f, err := os.Open(dirname)
if err != nil {
return nil, err
}
list, err := f.Readdir(-1)
f.Close()
if err != nil {
return nil, err
}
if reverse {
sort.Sort(sort.Reverse(byName(list)))
} else {
sort.Sort(byName(list))
}
return list, nil
}
// byName implements sort.Interface.
type byName []os.FileInfo
func (f byName) Len() int { return len(f) }
func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
func (f byName) Less(i, j int) bool {
nai, err := strconv.Atoi(f[i].Name())
if err != nil {
return f[i].Name() < f[j].Name()
}
naj, err := strconv.Atoi(f[j].Name())
if err != nil {
return f[i].Name() < f[j].Name()
}
return nai < naj
}