---
title: "declared and not used em Go"
url: "https://golang.com.br/erros/declared-not-used/"
markdown_url: "https://golang.com.br/erros/declared-not-used.MD"
description: "Resolva o erro 'declared and not used' em Go. Entenda por que Go não permite variáveis sem uso e conheça as formas corretas de lidar com isso."
date: "2026-05-12"
author: "Golang Brasil"
---

# declared and not used em Go

Resolva o erro 'declared and not used' em Go. Entenda por que Go não permite variáveis sem uso e conheça as formas corretas de lidar com isso.


# 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:

```go
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](/erros/multiple-value-in-single-value-context/), e você pode ser tentado a capturar todos sem usar:

```go
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:

```go
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:

```go
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:

```go
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:

```go
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:

```go
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](/aprenda/golang-erros/) para boas práticas.

### Solução 4: Range Simplificado

Se você não precisa do índice nem do valor, simplifique:

```go
// 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](/blog/go-1-22/), `for range N` permite iterar N vezes sem declarar variáveis:

```go
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:

```go
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](/blog/melhores-ferramentas-go-2026/).

2. **Nunca ignore erros com `_` em produção** — usar `_, _ = funcao()` para silenciar o compilador pode esconder bugs. Veja [por que tratar erros é importante](/aprenda/golang-erros/).

3. **Use `go vet`** — complementa o compilador com verificações adicionais. Integre ao seu fluxo de [testes e CI/CD](/tutoriais/go-tdd-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](/aprenda/por-que-aprender-go/) para entender essa filosofia. <a href="https://rustlang.com.br/blog/" target="_blank" rel="noopener noreferrer" onclick="umami.track('portfolio-site-click', { destination: 'rustlang.com.br' })">Rust</a> compartilha essa mesma filosofia com warnings para variáveis não usadas, enquanto <a href="https://python.dev.br/blog/" target="_blank" rel="noopener noreferrer" onclick="umami.track('portfolio-site-click', { destination: 'python.dev.br' })">Python</a> permite variáveis sem uso sem erro de compilação.

---

## Erros Relacionados

- [undefined: variable or function](/erros/undefined-variable-function/) — o oposto: referência a algo que não existe
- [multiple-value in single-value context](/erros/multiple-value-in-single-value-context/) — frequentemente causa variáveis extras que precisam ser tratadas
- [cannot range over](/erros/cannot-range-over/) — problemas com iteração e variáveis de range
- [Testes em Go](/aprenda/testes-go/) — como testar e manter código limpo
