@s60

Почему присвоение значения переменной не считается использованием переменной?

Компилятор GO не считает использованием переменной присвоение ей значения:
func main() {
	var value int
	value = 12

	if true {
		value = 1
	} else {
		value = 9
	}
}

или
func main() {
	value := 12

	if true {
		value = 1
	} else {
		value = 9
	}
}


Получаем один ответ:
./prog.go:4:6: value declared and not used


Несколько присвоений подряд дает ответ: value declared and not used
func main() {
value = 12
value = 13
value = 14
}

т.е. любое кол-во присваиваний значения не считается.

Внутри if тоже присваивание не считается:
if true {
		value = 1
	} else {
		value = 9
	}


Всегда получаем один ответ:
value declared and not used


Тип переменной не влияет - со string тот же результат:
func main() {
	value := "hello"

	if true {
		value = "malo"
	} else {
		value = "bolshe"
	}
}


При этом value = value + 1 считается за использование.
Но при этом value = 14 + 90 не считается ..... Хотя на место value+1 и 14+90 все равно ведь будет подставлено вычисленное значение.

Указание в условии if if value > 5 { считается за использование.

Как аргумент в функции println() fmt.Println(value) считается за использование.

Вопрос: Почему присвоение переменной значения не считается использованием ?

Погуглил declared and not used , но нагуглил лишь очевидные очевидности, которые в книжках по GO описаны
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
Потому что вы должны хотя бы раз прочитать значение переменной. Во всех случаях, которые вы приводите, где ошибки нет — значение переменной где-то читается.
Это сделано, чтобы исключить ряд багов, которые может допустить программист (например, зашедоуить переменную из скоупа выше и присвоить значение во временную переменную вместо оригинальной переменной).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@calculator212

Вопрос: Почему присвоение переменной значения не считается использованием ?
В целом можно ответить, что так решили разрабы, но в целом это логично, т.к. при присовении нового значения вы ничего не делаете с переменной, т.е. она фактически просто занимает память и не используется ни в каком выражении.
value = value + 1
В целом по логике этот случай тоже можно было бы отнести к неиспользованию, но вероятно тут такая логика, что это значение используется для вычисления нового значения, что по сути является использованием, компилятор не чекает используется дальше вычисленное значение но в данном случае это уже не особо и важно. В целом для обход not used есть такой способ
// No errors
a:= 1
b := 2
_, _ = a, b


Про "if value > 5 {" еще проще, это уже полноценное использование переменной в условии
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы