Trabalhando com arquivos ZIP em Go (Golang)
No desenvolvimento moderno em Go, surge frequentemente a necessidade de trabalhar com arquivos — para empacotar logs, distribuir configurações, backups ou transferir dados entre microsserviços. A biblioteca padrão do Go fornece um pacote poderoso e flexível archive/zip, que permite criar, ler e modificar arquivos ZIP sem dependências externas. Neste artigo, abordaremos detalhadamente todos os aspectos do trabalho com arquivos ZIP em Go.
Visão geral do pacote archive/zip
O pacote archive/zip faz parte da biblioteca padrão do Go e suporta:
- Leitura e escrita de arquivos ZIP (formato PKWARE)
- Compressão pelos métodos Deflate e Stored (sem compressão)
- Trabalho com arquivos e diretórios dentro do arquivo
- Suporte a comentários no arquivo e em arquivos individuais
- Definição de atributos de arquivos (data, permissões)
- Processamento em fluxo (arquivos podem pesar gigabytes)
Tipos principais: zip.Writer para criar arquivos e zip.Reader para leitura.
Criação de um arquivo ZIP
Para criar um arquivo, usa-se zip.NewWriter, que recebe um io.Writer. Cada arquivo é adicionado através de Create ou CreateHeader.
package main
import ( "archive/zip" "bytes" "fmt" "io" "log" "os")
func main() { // Cria um buffer para o arquivo buf := new(bytes.Buffer) writer := zip.NewWriter(buf)
// Adiciona um arquivo de texto file1, err := writer.Create("hello.txt") if err != nil { log.Fatal(err) } _, err = file1.Write([]byte("Hello, Go ZIP!")) if err != nil { log.Fatal(err) }
// Adiciona um arquivo com subdiretório file2, err := writer.Create("config/settings.json") if err != nil { log.Fatal(err) } _, err = file2.Write([]byte(`{"version": 1, "debug": true}`)) if err != nil { log.Fatal(err) }
// Fecha o writer obrigatoriamente err = writer.Close() if err != nil { log.Fatal(err) }
// Salva o arquivo no disco err = os.WriteFile("example.zip", buf.Bytes(), 0644) if err != nil { log.Fatal(err) } fmt.Println("Arquivo criado: example.zip")}Leitura e extração de arquivos do arquivo
Para ler o arquivo, usa-se zip.NewReader, que recebe um io.ReaderAt e o tamanho do arquivo. Pode-se ler tanto na memória quanto em fluxo.
func readArchive() { // Abre o arquivo do arquivo reader, err := zip.OpenReader("example.zip") if err != nil { log.Fatal(err) } defer reader.Close()
// Percorre todos os arquivos no arquivo for _, file := range reader.File { fmt.Printf("Arquivo: %s (tamanho: %d bytes)", file.Name, file.UncompressedSize64)
// Abre o arquivo dentro do arquivo rc, err := file.Open() if err != nil { log.Fatal(err) }
// Lê o conteúdo content, err := io.ReadAll(rc) if err != nil { log.Fatal(err) } rc.Close()
fmt.Printf("Conteúdo: %s
", content) }}Adicionando arquivos com metadados
Com zip.FileHeader, é possível definir data, permissões e método de compressão:
func addFileWithMetadata(w *zip.Writer, name, content string) error { header := &zip.FileHeader{ Name: name, Method: zip.Deflate, // Usa Deflate (compressão) } // Define o horário de modificação header.SetModTime(time.Now()) // Define as permissões (Unix rw-r--r--) header.SetMode(0644)
f, err := w.CreateHeader(header) if err != nil { return err } _, err = f.Write([]byte(content)) return Também na biblioteca
MetricsKit — monitoramento de aplicativos Swift (iOS/macOS)
PM2 para JavaScript (Node.js): guia completo com exemplos práticos
Geração de relatórios PDF em Go: visão geral das bibliotecas e exemplos de código