JSON e CSV em streaming
json.Decoder e encoding/csv para grandes volumes de dados
JSON e CSV em streaming é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 4 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.
Por que usar processamento em fluxo?
Carregar arquivos JSON ou CSV grandes inteiros na memória causa um uso elevado da memória dinâmica. O processamento em fluxo processa os registros um de cada vez, mantendo o uso de memória estável, independentemente do tamanho do arquivo.
json.Decoder para processamento em fluxo
json.NewDecoder envolve qualquer io.Reader. Use Token() para percorrer o fluxo de tokens JSON ou use Decode dentro de um laço para vetores JSON.
dec := json.NewDecoder(file)
// consume opening [
for dec.More() {
var record Record
dec.Decode(&record)
process(record)
}Detectando o início de um vetor
Chame dec.Token() para consumir o colchete de abertura antes do laço de decodificação:
t, _ := dec.Token() // consume [
for dec.More() {
var r Record
dec.Decode(&r)
}Processamento em fluxo a partir de HTTP
Decodifique JSON diretamente do corpo de uma resposta HTTP sem armazenar toda a resposta em um buffer:
resp, _ := http.Get(url)
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
for dec.More() {
var item Item
dec.Decode(&item)
process(item)
}Leitor de encoding/csv
csv.NewReader lê CSV linha por linha. Defina LazyQuotes, TrimLeadingSpace e Comment para lidar com variantes de CSV do mundo real.
r := csv.NewReader(file)
for {
record, err := r.Read()
if err == io.EOF { break }
if err != nil { return err }
process(record)
}Ignorando o cabeçalho CSV
Leia e descarte o primeiro registro para ignorar a linha do cabeçalho:
r.Read() // discard header
for {
record, err := r.Read()
if err == io.EOF { break }
}csv.Writer
Grave CSV linha por linha com csv.NewWriter. Sempre chame w.Flush() e verifique w.Error() depois de gravar.
w := csv.NewWriter(file)
w.Write([]string{"name", "age"})
w.Flush()
if err := w.Error(); err != nil { return err }Delimitador personalizado
Arquivos CSV às vezes usam ponto e vírgula ou tabulações. Defina r.Comma como a runa desejada.
r := csv.NewReader(file)
r.Comma = ';' // semicolon-separatedLinhas JSON em fluxo (NDJSON)
JSON delimitado por novas linhas (um objeto JSON por linha) é simples de processar em fluxo: leia linha por linha e desserialize cada linha de forma independente.
scanner := bufio.NewScanner(file)
for scanner.Scan() {
var record Record
json.Unmarshal(scanner.Bytes(), &record)
}Transmissão do perfil de memória
Com o processamento em fluxo, a alocação no heap permanece em O(tamanho do registro), em vez de O(tamanho do arquivo). Para um arquivo de 1 GB com registros de 1 KB, o processamento em fluxo usa aproximadamente 1 KB, contra aproximadamente 1 GB no carregamento em memória.
Cancelamento do contexto no processamento em fluxo
Verifique ctx.Done() dentro do loop de decodificação para interromper o processamento em fluxo quando o contexto for cancelado, evitando que as goroutines continuem lendo até EOF.
for dec.More() {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
dec.Decode(&record)
}Verificação rápida
Qual é a vantagem de processar JSON em fluxo com json.Decoder em vez de usar json.Unmarshal?
Recapitulação: processamento em fluxo de JSON e CSV
Pontos principais:
- json.Decoder: use um loop com dec.More() para matrizes JSON
- csv.NewReader: leia linha por linha; defina Comma para delimitadores personalizados
- NDJSON: bufio.Scanner + Unmarshal para cada linha
- O processamento em fluxo mantém o uso de memória constante, independentemente do tamanho do arquivo
Perguntas Frequentes
A aula “JSON e CSV em streaming” é grátis?
Sim — o texto completo de “JSON e CSV em streaming” é 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 “JSON e CSV em streaming”?
json.Decoder e encoding/csv para grandes volumes de dados 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 4 de 4.
Quanto tempo leva a aula “JSON e CSV em streaming”?
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
- Lendo arquivos com os e bufio
- Escrevendo arquivos e arquivos temporários
- Codificação e decodificação de JSON
- JSON e CSV em streaming