Golang: Как эффективно определить количество строк в файле?
Я ищу эффективный способ подсчитать количество строк в файле на языке Golang.
Конечно, я могу просто пройтись по всему файлу в цикле, но это не кажется очень эффективным подходом.
file, _ := os.Open("/path/to/filename")
fileScanner := bufio.NewScanner(file)
lineCount := 0
for fileScanner.Scan() {
lineCount++
}
fmt.Println("number of lines:", lineCount)
Существует ли более быстрый и менее затратно ресурсов способ узнать, сколько строк в файле?
1 ответ(ов)
Чтобы подсчитать количество новых строк в файле, вы можете использовать следующий код на Go:
// Константа для обозначения символа новой строки, нет необходимости преобразовывать его при каждом вызове newlines_in_file.
var newline_char = []byte("\n")
// Не используйте интерфейсы, если вам не нужно работать с разными источниками (файлы, сеть и т.д.).
func newlines_in_file(r *os.File) (lines int, err error) {
var (
n int
buf = [256]byte{} // Буфер, выделенный в стеке
)
// Установите условие на цикл
for err == nil {
n, err = r.Read(buf[:])
lines += bytes.Count(buf[:n], newline_char)
}
// Если возможно, избегайте использования if и switch внутри циклов, это условие можно вынести за цикл
if err != io.EOF {
return lines, err
}
// Счастливый путь - последнее выражение
return lines, nil
}
Этот код не использует io.Reader
, что позволяет избежать выделения памяти, так как он использует буфер, выделенный в стеке.
BenchmarkLines-12 2990632 391.6 ns/op 0 B/op 0 allocs/op
Таким образом, этот подход демонстрирует отличную производительность без необходимости дополнительного выделения памяти.
Существует ли цикл foreach в Go?
Как сопоставить любой символ на нескольких строках в регулярном выражении?
Отформатировать строку в Go без вывода?
Есть ли способ получить доступ к приватным полям структуры из другого пакета?
Получение тега поля структуры с использованием пакета reflect в Go