Ошибка declared and not used
./main.go:6:2: declared and not used: totalGo не собирает программу, в которой переменная внутри функции объявлена, но нигде не читается. Это не предупреждение, а ошибка: так компилятор ловит опечатки и забытый код. В сообщении — файл, строка, позиция и имя переменной. В версиях до Go 1.20 сообщение выглядело иначе: total declared but not used.
Как исправить
Посмотрите на переменную из сообщения и выберите одно из трёх.
Переменная не нужнаудалите её
Удалите строку, где она объявлена, и все присваивания ей.
Переменная нужна, но забытаиспользуйте её
Например, посчитали сумму, но не вывели:
package main
import "fmt"
func main() {
total := 0
for i := 1; i <= 4; i++ {
total += i
}
fmt.Println(total)
}10Без последней строки эта программа не соберётся: total только присваивается, но не читается.
Ненужное значение вернула функциязамените имя на _
Если функция возвращает несколько значений, а одно из них не нужно, вместо его имени пишут _ — пустой идентификатор:
package main
import (
"fmt"
"strconv"
)
func main() {
_, err := strconv.Atoi("12x")
if err != nil {
fmt.Println("не число")
}
}не число_ можно писать сколько угодно раз, и использовать его не нужно.
Пока пишете код
Если переменная понадобится позже, а собрать программу нужно сейчас, временно напишите:
_ = totalЭто считается использованием. Не забудьте убрать строку, когда переменная заработает.
Где ошибка подстерегает
- Присваивание — не использование.
x := 1и затемx = 2— всё равно ошибка: значение ни разу не прочитано. - Переменная в цикле range.
for i, v := range sс неиспользуемымiне соберётся — пишитеfor _, v := range s. Если не нужно и значение —for i := range s. - Переменная в switch по типу. В
switch x := v.(type)переменнаяxдолжна использоваться хотя бы в одной ветке. Если она не нужна, пишитеswitch v.(type).
Тень переменной
Внутри блока if или for новое := создаёт новую переменную с тем же именем, а внешняя остаётся как была:
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.