Listagem de diretórios em Go: guia completo com exemplos de código

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

Listagem de diretórios em Go: do simples ao complexo

\n\n

Trabalhar com o sistema de arquivos é uma das tarefas básicas de qualquer linguagem de programação. Em Go, isso é implementado de forma tão elegante que até mesmo uma operação rotineira como list directory in Go se transforma em uma aventura fascinante. Se você já se perguntou: "Como faço para obter uma lista de arquivos em uma pasta em Go?" — você veio ao lugar certo. Hoje vamos analisar todas as formas possíveis, desde a saída simples até a travessia recursiva com filtragem.

\n\n

Por que este tópico é tão popular no Stack Overflow? Porque Go oferece várias abordagens, e escolher a correta é metade do sucesso. Vamos ver o clássico os.ReadDir, o obsoleto ioutil.ReadDir (mas ainda pode ser encontrado em projetos antigos), e o poderoso filepath.Walk para travessia recursiva. Vamos lá!

\n\n

1. Listagem mais simples: os.ReadDir

\n\n

A partir do Go 1.16, o pacote os ganhou um novo método ReadDir, que se tornou o padrão de facto. Ele retorna uma fatia de objetos os.DirEntry — descrições leves de arquivos e pastas. Veja como funciona:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "log"\n)\n\nfunc main() {\n    // Lê o conteúdo do diretório atual\n    entries, err := os.ReadDir(".")\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    fmt.Println("Conteúdo da pasta atual:")\n    for _, entry := range entries {\n        fmt.Printf("- %s (diretório: %v)\\n", entry.Name(), entry.IsDir())\n    }\n}\n
\n\n

Este código exibirá todos os arquivos e pastas no diretório atual. Observe: os.ReadDir não lê subpastas — apenas o primeiro nível. Se você precisa de list directory in Go recursivamente, continue lendo.

\n\n

2. ioutil.ReadDir: antigo, mas familiar

\n\n

Antes da versão Go 1.16, todos usavam ioutil.ReadDir. Ele retorna []os.FileInfo — uma estrutura mais pesada com informações completas do arquivo (tamanho, permissões, data de modificação). Embora o método esteja marcado como deprecated, você ainda pode encontrá-lo em código legado:

\n\n
package main\n\nimport (\n    "fmt"\n    "io/ioutil"\n    "log"\n)\n\nfunc main() {\n    files, err := ioutil.ReadDir("./mydir")\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    fmt.Println("Arquivos em mydir (método antigo):")\n    for _, file := range files {\n        fmt.Printf("Nome: %s, Tamanho: %d bytes\\n", file.Name(), file.Size())\n    }\n}\n
\n\n

A principal diferença: ioutil.ReadDir ordena o resultado pelo nome do arquivo (como ls), enquanto os.ReadDir não. Se a ordem for importante, use sort.Slice ou ordenação manual.

\n\n

3. Travessia recursiva com filepath.Walk

\n\n

Quando você precisa percorrer todas as subpastas, filepath.Walk vem ao resgate. Esta função percorre a árvore de diretórios, chamando um callback para cada item encontrado. Ideal para backups, busca de arquivos ou análise de estrutura de projetos:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n)\n\nfunc main() {\n    root := "./myproject"\n    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n        fmt.Printf("Encontrado: %s (tamanho: %d)\\n", path, info.Size())\n        return nil\n    })\n    if err != nil {\n        fmt.Println("Erro na travessia:", err)\n    }\n}\n
\n\n

Uma nuance importante: filepath.Walk segue links simbólicos e pode entrar em um loop infinito se houver referências cíclicas. Para produção, use filepath.WalkDir (Go 1.16+) — é mais leve e seguro.

\n\n

4. Filtragem: apenas arquivos .go ou apenas pastas

\n\n

Muitas vezes você não precisa de tudo, mas apenas de tipos específicos de arquivos. Vamos implementar a filtragem usando strings.HasSuffix e a verificação IsDir()

Blogs

Book Recommendations