Глиф Учебники

Ошибка declared and not used

Справочник · Go · 2 минуты чтения

Текст
./main.go:6:2: declared and not used: total

Go не собирает программу, в которой переменная внутри функции объявлена, но нигде не читается. Это не предупреждение, а ошибка: так компилятор ловит опечатки и забытый код. В сообщении — файл, строка, позиция и имя переменной. В версиях до Go 1.20 сообщение выглядело иначе: total declared but not used.

Как исправить

Посмотрите на переменную из сообщения и выберите одно из трёх.

Переменная не нужнаудалите её

Удалите строку, где она объявлена, и все присваивания ей.

Дальше: «Пока пишете код»

Переменная нужна, но забытаиспользуйте её

Например, посчитали сумму, но не вывели:

Go
package main

import "fmt"

func main() {
    total := 0
    for i := 1; i <= 4; i++ {
        total += i
    }
    fmt.Println(total)
}
Вывод
10

Без последней строки эта программа не соберётся: total только присваивается, но не читается.

Дальше: «Пока пишете код»

Ненужное значение вернула функциязамените имя на _

Если функция возвращает несколько значений, а одно из них не нужно, вместо его имени пишут _ — пустой идентификатор:

Go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    _, err := strconv.Atoi("12x")
    if err != nil {
        fmt.Println("не число")
    }
}
Вывод
не число

_ можно писать сколько угодно раз, и использовать его не нужно.

Пока пишете код

Если переменная понадобится позже, а собрать программу нужно сейчас, временно напишите:

Go
_ = total

Это считается использованием. Не забудьте убрать строку, когда переменная заработает.

Где ошибка подстерегает

Тень переменной

Внутри блока if или for новое := создаёт новую переменную с тем же именем, а внешняя остаётся как была:

Go
var err error
if ok {
    result, err := compute() // новая err — только внутри if
    fmt.Println(result)
}
return err // всегда nil: внутренняя err сюда не попала

Внутренняя err нигде не читается, и компилятор сообщит declared and not used: err — в этом случае ошибка компиляции даже помогает найти настоящую ошибку в логике. Чтобы присвоить внешней переменной, объявите result заранее (var result int) и пишите result, err = compute().

Что разрешено оставлять

Неиспользуемые переменные уровня пакета (объявленные вне функций), константы, параметры функций и функции ошибкой не считаются — правило касается только переменных внутри функций. Для лишнего import есть своя ошибка — imported and not used.