Trabalho com o sistema de arquivos em Go: do básico às técnicas avançadas
Go (Golang) é uma linguagem de programação compilada moderna, conhecida por seu desempenho, simplicidade e suporte integrado para trabalhar com o sistema de arquivos. A capacidade de ler, escrever, criar e gerenciar arquivos e diretórios de forma eficiente é uma habilidade fundamental para qualquer desenvolvedor Go. Neste artigo, vamos detalhar as operações básicas com o sistema de arquivos usando a biblioteca padrão os, io/ioutil (a partir do Go 1.16, recomenda-se usar os e io) e path/filepath. Você aprenderá como abrir e fechar arquivos, ler e escrever dados, trabalhar com diretórios e percorrer árvores de arquivos.
1. Básico: abrir, ler e escrever arquivos
Trabalhar com arquivos em Go começa com o pacote os. Para abrir um arquivo, use a função os.Open (somente leitura) ou os.OpenFile (para leitura e escrita, especificando o modo). Após o uso, o arquivo deve ser fechado com defer file.Close() para liberar recursos do sistema.
Ler um arquivo inteiro
A maneira mais simples de ler um arquivo é usar os.ReadFile (disponível desde o Go 1.16). Ele retorna um slice de bytes e um erro.
package main
import ( "fmt" "os")
func main() { data, err := os.ReadFile("example.txt") if err != nil { fmt.Println("Erro ao ler arquivo:", err) return } fmt.Println("Conteúdo do arquivo:") fmt.Println(string(data))}Escrever em um arquivo
Para escrever dados em um arquivo, use os.WriteFile. Ele cria ou sobrescreve o arquivo.
package main
import ( "os")
func main() { content := []byte("Olá, mundo!Esta é uma linha para escrever.") err := os.WriteFile("output.txt", content, 0644) if err != nil { panic(err) }}Observe o terceiro argumento — 0644. Estas são as permissões de acesso ao arquivo no estilo Unix (o proprietário pode ler e escrever, os outros só podem ler).
Leitura e escrita com buffer
Para arquivos grandes ou processamento em fluxo, use bufio:
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Open("large.txt") if err != nil { panic(err) } defer file.Close()
scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println("Erro de digitalização:", err) }}2. Trabalhando com diretórios
Go fornece funções convenientes para criar, excluir e ler diretórios. As principais estão no pacote os.
Criar um diretório
Para criar um único diretório, use os.Mkdir; para diretórios aninhados, use os.MkdirAll.
package main
import ( "os")
func main() { // Criar um único diretório err := os.Mkdir("newdir", 0755) if err != nil { panic(err) }
// Criar diretórios aninhados err = os.MkdirAll("path/to/nested/dir", 0755) if err != nil { panic(err) }}Ler o conteúdo de um diretório
A função os.ReadDir retorna uma lista de itens em um diretório (disponível desde o Go 1.16).
package main
import ( "fmt" "os")
func main() { entries, err := os.ReadDir(".") if err != nil { panic(err) }
for _, entry := range entries { fmt.Println(entry.Name(), entry.IsDir()) }}Excluir arquivos e diretórios
Para exclusão, use os.Remove (para um arquivo ou diretório vazio) e os.RemoveAll