declared and not used em Go
O erro “declared and not used” é único do Go e uma das primeiras surpresas para quem vem de outras linguagens. Enquanto a maioria das linguagens apenas emite um warning para variáveis não utilizadas, Go trata isso como um erro de compilação — seu programa simplesmente não compila.
Essa decisão de design é intencional: código morto dificulta a leitura e manutenção, e o compilador do Go prefere ser rigoroso do que permissivo.
A Mensagem de Erro
./main.go:8:2: declared and not used: resultado
./main.go:9:2: declared and not used: err
Causas Comuns
1. Variável Declarada e Nunca Usada
O caso mais simples — você declarou uma variável mas não a usou em lugar nenhum:
package main
import "fmt"
func main() {
nome := "Go"
idade := 17 // ERRO: declared and not used: idade
fmt.Println(nome)
}
2. Ignorar Retorno de Função com Múltiplos Valores
Funções Go frequentemente retornam múltiplos valores, e você pode ser tentado a capturar todos sem usar:
package main
import "os"
func main() {
file, err := os.Open("config.json")
// ERRO: declared and not used: err
// (se você não verificar err)
_ = file
}
3. Variável de Iteração Não Utilizada
Ao iterar com range, você recebe índice e valor:
package main
import "fmt"
func main() {
frutas := []string{"maçã", "banana", "uva"}
for i, fruta := range frutas {
// ERRO: declared and not used: i (se não usar o índice)
fmt.Println(fruta)
}
}
4. Debug Temporário Removido
Você adicionou uma variável para depuração e esqueceu de removê-la:
func processar(dados []byte) error {
debug := string(dados) // ERRO se não usar debug
// ... resto do código
return nil
}
Como Resolver
Solução 1: O Identificador em Branco _
O underscore _ é o identificador em branco — ele descarta o valor explicitamente:
package main
import (
"fmt"
"os"
)
func main() {
// Descarta o erro (CUIDADO: só faça isso conscientemente!)
file, _ := os.Open("config.json")
defer file.Close()
// Descarta o índice no range
frutas := []string{"maçã", "banana", "uva"}
for _, fruta := range frutas {
fmt.Println(fruta)
}
}
Solução 2: Remover a Variável
Se você realmente não precisa dela, remova:
package main
import "fmt"
func main() {
nome := "Go"
// Removido: idade não é mais necessária
fmt.Println(nome)
}
Solução 3: Usar a Variável
Às vezes a variável deveria ser usada — verifique se você não esqueceu de incluir lógica:
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Open("config.json")
if err != nil {
fmt.Println("Erro ao abrir:", err)
return
}
defer file.Close()
// Agora tanto file quanto err são usados
fmt.Println("Arquivo aberto:", file.Name())
}
Tratar erros corretamente é fundamental em Go — consulte nosso guia de tratamento de erros para boas práticas.
Solução 4: Range Simplificado
Se você não precisa do índice nem do valor, simplifique:
// Só precisa do índice
for i := range frutas {
fmt.Println(i)
}
// Não precisa de nenhum — apenas contar iterações
for range frutas {
fmt.Println("processando...")
}
A partir do Go 1.22, for range N permite iterar N vezes sem declarar variáveis:
for range 5 {
fmt.Println("repetindo")
}
Nota Importante: Imports Não Usados
Go também não permite imports não utilizados. Se você importar um pacote sem usar nenhuma função dele, o compilador reclama:
./main.go:4:2: "fmt" imported and not used
A solução é a mesma: remova o import ou use o identificador em branco para manter o side-effect:
import (
_ "image/png" // Import para side-effect (registra decodificador PNG)
)
Dicas para Evitar Este Erro
Configure o gopls — ele detecta variáveis não usadas em tempo real no seu editor.
Nunca ignore erros com
_em produção — usar_, _ = funcao()para silenciar o compilador pode esconder bugs. Veja por que tratar erros é importante.Use
go vet— complementa o compilador com verificações adicionais. Integre ao seu fluxo de testes e CI/CD.Remova código morto — ao invés de comentar variáveis, remova-as. O controle de versão (Git) guarda o histórico.
Entenda o design — Go valoriza código limpo e explícito. Veja por que aprender Go para entender essa filosofia. Rust compartilha essa mesma filosofia com warnings para variáveis não usadas, enquanto Python permite variáveis sem uso sem erro de compilação.
Erros Relacionados
- undefined: variable or function — o oposto: referência a algo que não existe
- multiple-value in single-value context — frequentemente causa variáveis extras que precisam ser tratadas
- cannot range over — problemas com iteração e variáveis de range
- Testes em Go — como testar e manter código limpo