Trabalhando com arquivos ZIP em Go: guia completo sobre o pacote archive/zip

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations