Reading a file line by line in Go

Clive B.
jump to solution

The Problem

I don’t know how to read a file line by line in Go.

The Solution

In Go, you can use the bufio.Scanner function, which accepts an io.Reader interface, to read lines separated by a newline.

Files opened using os.Open satisfy the io.Reader interface.

The following code prints file contents line by line:

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
)

func main() {
	file, err := os.Open("/path/to/file.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		// This will print the file contents line by line.
		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}
}

Advanced Usage

If you want to scan through a file and split its contents by something other than newlines, you can specify a custom split function. Go supplies a few custom split functions in the standard library, namely bufio.ScanBytes, bufio.ScanLines, bufio.ScanRunes, and bufio.ScanWords.

For example, you can split a text by spaces so that each space-separated word is printed individually:

package main

import (
	"bufio"
	"bytes"
	"fmt"
	"log"
)

func main() {
	words := bytes.NewReader([]byte("This is some example text."))

	scanner := bufio.NewScanner(words)

	scanner.Split(bufio.ScanWords)

	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}
}

This prints:

This
is
some
example
text.

Further Reading

  • The Go bufio package
  • The Reader interface in the Go io package
  • The Open function in the Go os package
  • The Newline Wikipedia entry
Concatenating strings in Go
Clive B.
How To Print Struct Fields in Go
Clive B.
Go For Each Loops
Venter C.
Optional functional parameters in Go
Clive B.

Considered "not bad" by 4 million developers and more than 150,000 organizations worldwide, Sentry provides code-level observability to many of the world's best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.

Sentry