0Pricing
Go Academy · Aula

Scanners

Leia linha por linha

Scanners é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

O que é bufio.Scanner

bufio.Scanner é a maneira mais fácil de ler a entrada unidade por unidade, geralmente linha por linha.

Ele oculta o uso da memória intermediária e o tratamento de delimitadores, além de remover a nova linha final para você.

Lendo linhas

Crie um scanner e faça um laço com Scan(), que retorna false ao chegar ao fim. Leia a unidade atual com Text().

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("one\ntwo\nthree"))
	for s.Scan() {
		fmt.Println("line:", s.Text())
	}
}

Lendo palavras

Defina a função de divisão com Split(bufio.ScanWords) para separar por espaços em branco em vez de linhas.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("the quick brown fox"))
	s.Split(bufio.ScanWords)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

Contando unidades

Os scanners tornam a contagem trivial. Aqui, contamos palavras.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("a b c d e"))
	s.Split(bufio.ScanWords)
	count := 0
	for s.Scan() {
		count++
	}
	fmt.Println("words:", count)
}

Bytes versus Text

Text() retorna uma cópia da cadeia de caracteres. Bytes() retorna a fatia subjacente, que é reutilizada na próxima chamada a Scan() — faça uma cópia dela se precisar mantê-la.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("data"))
	s.Scan()
	fmt.Println(len(s.Bytes()), "bytes")
}

Lendo runas

bufio.ScanRunes divide a entrada em runas UTF-8, uma unidade por caractere.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("Gö"))
	s.Split(bufio.ScanRunes)
	for s.Scan() {
		fmt.Printf("[%s]", s.Text())
	}
	fmt.Println()
}

Verificando erros

O retorno false de Scan() pode significar EOF ou um erro. Depois do laço, chame s.Err() para distingui-los.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("ok\nfine"))
	for s.Scan() {
		fmt.Println(s.Text())
	}
	if err := s.Err(); err != nil {
		fmt.Println("error:", err)
	}
}

O limite de tamanho da unidade

Por padrão, uma única unidade não pode exceder bufio.MaxScanTokenSize (64KB). Uma linha mais longa faz Scan() parar com um erro.

Aumentando a memória intermediária

Use Buffer(buf, max) para permitir unidades maiores. Passe uma memória intermediária inicial e um tamanho máximo.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("long line here"))
	buf := make([]byte, 0, 1024)
	s.Buffer(buf, 1024*1024)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

Funções de divisão personalizadas

Uma função de divisão tem a assinatura func(data []byte, atEOF bool) (advance int, token []byte, err error). Você pode dividir por vírgulas, larguras fixas ou qualquer outro critério.

Scanner versus Reader

  • Scanner: unidades simples de linha ou palavra, remove novas linhas automaticamente, limite padrão de 64KB
  • Reader: controle total, sem limite de tamanho, tratamento manual de delimitadores

Comece com Scanner; passe para Reader quando precisar de mais controle.

Verificação rápida

Verifique seus conhecimentos sobre Scanner.

Recapitulação

Você aprendeu a ler a entrada unidade por unidade com bufio.Scanner.

  • Laço com Scan() + Text()/Bytes()
  • Split com ScanLines/ScanWords/ScanRunes
  • Verifique Err() depois do laço
  • Use Buffer para unidades com mais de 64KB

Perguntas Frequentes

A aula “Scanners” é grátis?

Sim — o texto completo de “Scanners” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “Scanners”?

Leia linha por linha Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Scanners”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Leitores com buffer
  2. Scanners
  3. Gravadores com buffer
  4. Transmissão de arquivos grandes
← Voltar para Go Academy