Verificação de existência de arquivo em Go: velocidade, erros e melhores práticas

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

Por que a pergunta "How to check if a file exists in Go?" se tornou viral

\n\n

Se você já escreveu um programa em Go que trabalha com arquivos, certamente já se deparou com esta pergunta. No Stack Overflow, ela acumulou centenas de milhares de visualizações e dezenas de comentários com debates acalorados. Parece simples, não? Em Python existe os.path.exists(), em PHP — file_exists(), e em Go?

\n\n

O problema é que Go não possui uma função embutida FileExists(). E isso não é por acaso. Os desenvolvedores da linguagem conscientemente evitaram essa abordagem, porque verificar a existência de um arquivo é uma condição de corrida (race condition) pura. Enquanto você verifica, o arquivo pode ser excluído ou criado por outra goroutine. Por isso, em Go, é comum simplesmente tentar abrir o arquivo e tratar o erro.

\n\n

Mas como fazer isso corretamente? Como não perder desempenho e não cair em bugs ocultos? Hoje vamos analisar a verificação de existência de arquivo em Go do início ao fim: desde exemplos básicos até soluções de produção.

\n\n

Primeira abordagem: os.Stat e os.IsNotExist (clássico do Stack Overflow)

\n\n

A resposta mais popular no Stack Overflow é assim:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc fileExists(filename string) bool {\n    info, err := os.Stat(filename)\n    if os.IsNotExist(err) {\n        return false\n    }\n    return err == nil && !info.IsDir()\n}\n\nfunc main() {\n    if fileExists("example.txt") {\n        fmt.Println("Arquivo existe")\n    } else {\n        fmt.Println("Arquivo não encontrado")\n    }\n}\n
\n\n

Este código usa os.Stat(), que retorna informações sobre o arquivo. Se o arquivo não existe, a função retorna um erro, e verificamos isso com os.IsNotExist(). Adicionalmente, verificamos que não é um diretório — pois os.Stat() também funciona em pastas.

\n\n

Vantagens: simplicidade, legibilidade, mínimo de dependências.

\n\n

Desvantagens: potencial condição de corrida entre a verificação e a abertura do arquivo. Se você verifica a existência e depois abre o arquivo, entre essas operações o arquivo pode desaparecer. Em Go, é comum tentar abrir o arquivo imediatamente e tratar o erro.

\n\n

Desempenho do os.Stat

\n\n

A chamada os.Stat() é uma chamada de sistema. No Linux, é stat() ou lstat(). É rápida, mas não instantânea. Em média, uma chamada leva de 1 a 5 microssegundos em SSD. Se você estiver verificando centenas de milhares de arquivos, isso pode se tornar um gargalo.

\n\n

Otimização: se você precisa verificar a existência de muitos arquivos, considere armazenar resultados em cache ou usar filepath.Glob() com um padrão.

\n\n

Segunda abordagem: abertura do arquivo e tratamento de erros (Go Way)

\n\n

Uma forma mais idiomática é tentar abrir o arquivo imediatamente. Isso resolve o problema da condição de corrida:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc openFile(filename string) (bool, error) {\n    file, err := os.Open(filename)\n    if err != nil {\n        if os.IsNotExist(err) {\n            return false, nil\n        }\n        return false, err // Outro erro: sem permissão, link quebrado, etc.\n    }\n    defer file.Close()\n    return true, nil\n}\n\nfunc main() {\n    exists, err := openFile("example.txt")\n    if err != nil {\n        fmt.Printf("Erro: %v\\n", err)\n        return\n    }\n    if exists {\n        fmt.Println("Arquivo existe e está acessível")\n    }\n}\n
\n\n

Este código abre o arquivo imediatamente. Se ocorrer um erro, verificamos se é especificamente o erro "arquivo não encontrado". Qualquer outro erro (por exemplo, permissão insuficiente) é retornado — isso dá mais controle.

\n\n

Vantagens: atomicidade da operação, tratamento correto de erros, ausência de condição de corrida.

\n\n

Desvantagens: abrimos o arquivo mesmo se precisamos apenas verificar sua existência. Para arquivos grandes, isso pode ser custoso

Blogs

Book Recommendations