Как эффективно читать файл строка за строкой в GO
- Упаковка и необходимые импортные товары
- Чтение строк за строкой вперёд
- Полный код для чтения файла строка за строкой вперёд
- Настройка поведения сканера в Go

Файловый ввод/вывод, а именно чтение и запись в файлы, является довольно распространенной функциональностью языков программирования. Часто необходимо читать файл построчно. GO предоставляет пакет bufio
, который в основном реализует буферизованный ввод/вывод. bufio
предоставляет полезные типы и функции, особенно для чтения и записи в текстовые файлы.
Упаковка и необходимые импортные товары
package main
import(
"fmt"
"bufio"
"log"
"os"
)
Нам понадобится несколько импортов из GO стандартная библиотека:-.
- os - для платформонезависимого интерфейса к функциональности ОС.
- fmt - реализация функциональности форматированных входов/выходов.
- log - стандартный пакет протоколирования
- буфио - поддерживает буферизацию входов/выходов.
Чтение строк за строкой вперёд
Перед чтением файла его нужно сначала открыть функцией os.Open()
, которая возвращает в файл тип указателя. Файл test.txt
, показанный в фрагменте кода, должен существовать заранее (указать путь к файлу).
Функция bufio.NewScanner(file)
возвращает тип сканера, который имеет функции, поддерживающие чтение через файл.
Чтобы прочитать файл построчно, мы должны использовать два метода на новом Scanner
- Scan
, который переводит сканер на новый маркер (в данном случае на новую строку) и Text
(или Byte
), который считывает самую последнюю маркерную запись, которая была сгенерирована при вызове Scan
.
Если при чтении файла были обнаружены какие-либо ошибки, они могут быть обработаны вызовом метода Err()
на новом Scanner
, который будет возвращать первую ошибку, с которой столкнулся Scanner
.
func main(){
// open the file
file, err := os.Open("test.txt")
//handle errors while opening
if err != nil {
log.Fatalf("Error when opening file: %s", err)
}
fileScanner := bufio.NewScanner(file)
// read line by line
for fileScanner.Scan() {
fmt.Println(fileScanner.Text())
}
// handle first encountered error while reading
if err := fileScanner.Err(); err != nil {
log.Fatalf("Error while reading file: %s", err)
}
file.Close()
}
Полный код для чтения файла строка за строкой вперёд
Полный код в main.go
для чтения файла строка за строкой приведен ниже.
Вам необходимо набрать:
$ go run main.go
чтобы запустить программу в терминале.
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
// open the file
file, err := os.Open("test.txt")
//handle errors while opening
if err != nil {
log.Fatalf("Error when opening file: %s", err)
}
fileScanner := bufio.NewScanner(file)
// read line by line
for fileScanner.Scan() {
fmt.Println(fileScanner.Text())
}
// handle first encountered error while reading
if err := fileScanner.Err(); err != nil {
log.Fatalf("Error while reading file: %s", err)
}
file.Close()
}
Настройка поведения сканера в Go
Тип Scanner
имеет функцию SplitFunc
, которая принимает функцию SplitFunc
для определения того, как сканер собирается разделить заданный срез байта. По умолчанию SplitFunc
имеет функцию ScanLines
, которая возвращает каждую строку текста, лишённую маркера конца строки.
Например, мы могли бы разделиться, используя слова, как показано в фрагменте кода ниже:-
scanner.Split(bufio.ScanWords) //configure how the scanner behaves