Ответ
В Go операции инкремента (++
) и декремента (--
) реализованы иначе, чем в языках вроде C++, Java или C#. Ключевое отличие в том, что в Go это операторы (statements), а не выражения (expressions).
Это означает:
-
Они не возвращают значение. Вы не можете присвоить результат инкремента переменной.
var i = 1 // j := i++ // Ошибка компиляции: syntax error: unexpected ++ at end of statement
-
Существует только постфиксная форма. Префиксная форма (
++i
) в Go отсутствует.var i = 1 i++ // OK // ++i // Ошибка компиляции: syntax error: unexpected ++, expecting operand
-
Их нельзя использовать внутри других выражений. Например, в качестве аргумента функции или в условном операторе.
// if i++ > 1 { ... } // Ошибка компиляции // fmt.Println(i++) // Ошибка компиляции
Почему так сделано?
Это сознательное решение дизайнеров языка для упрощения синтаксиса и устранения целого класса багов, связанных с неочевидным порядком вычислений в сложных выражениях (например, a[i++] = i
). В Go код становится более предсказуемым и читаемым: сначала вы изменяете переменную, а затем используете её новое значение в следующей строке.
Итог:
В Go нет разницы между преинкрементом и постинкрементом, так как преинкремент просто не существует. Есть только постинкрементный оператор i++
, который увеличивает значение переменной и ничего не возвращает.