Go percorrendo a árvore de diretórios

Com a ajuda do pacote path/filepath é fácil percorrer diretórios e arquivos.

Eu estava com um problema de ter que digitar o caminho completo para chegar no diretório do projeto que eu queria trabalhar, esta tudo no GOPATH e os caminhos geralmente são longos. Tudo bem digitar todo o caminho uma vez ou outra, mas como estou trabalhando todo dia com Go e em mais de um projeto ter que digitar o caminho completo rapidamente se torna uma tarefa entediante. E as vezes eu nem sei onde exatamente o projeto esta, as vezes não lembro alguma parte do path como o nome do autor ou se esta no GitHub ou em outro repositório.

Para resolver esse problema eu criei um pequeno utilitário que tem a função de percorrer todos os diretórios do GOPATH e retornar o caminho completo para a pasta do package, e assim nasceu o lpk (list package)

Para demostrar melhor a ideia e as funcionalidades do lpk eu fiz um vídeo que também mostra o código fonte da primeira versão.

Eu usei a função Walk do pacote path/filepath que é bastante simples. Essa função recebe dois parâmetros, o primeiro uma string contendo o diretório raiz onde você quer iniciar a pesquisa e o segundo é uma função que será chamada para arquivo ou diretório sob o diretório raiz.

A chamada para a função Walk é assim:

err = filepath.Walk(root, visit)

Nesse exemplo visit é a função que vai receber os dados do item sendo acessado no momento, que pode ser um diretório ou um arquivo.

Essa função deve ter o seguinte formato:

func visit(path string, f os.FileInfo, err error) error {
    ...
    return nil
}

E o valor de retorno difere dependendo do comportamento que você quer, por exemplo se você retornar apenas um nil, Walk vai para o proximo arquivo ou diretório, já se você retornar filepath.SkipDir o diretório que esta sendo acessado agora vai ser ignorado ou seja Walk não vai entrar nele, e se você retornar io.EOF Walk vai parar e retornar para a função que o chamou. E claro você também retornar qualquer outro valor que implemente a interface error.

comments powered by Disqus