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

  1. Configure o gopls — ele detecta variáveis não usadas em tempo real no seu editor.

  2. Nunca ignore erros com _ em produção — usar _, _ = funcao() para silenciar o compilador pode esconder bugs. Veja por que tratar erros é importante.

  3. Use go vet — complementa o compilador com verificações adicionais. Integre ao seu fluxo de testes e CI/CD.

  4. Remova código morto — ao invés de comentar variáveis, remova-as. O controle de versão (Git) guarda o histórico.

  5. 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