Как в Go реализованы операции инкремента и декремента и чем они отличаются от C-подобных языков?

Ответ

В Go операции инкремента (++) и декремента (--) реализованы иначе, чем в языках вроде C++, Java или C#. Ключевое отличие в том, что в Go это операторы (statements), а не выражения (expressions).

Это означает:

  1. Они не возвращают значение. Вы не можете присвоить результат инкремента переменной.

    var i = 1
    // j := i++ // Ошибка компиляции: syntax error: unexpected ++ at end of statement
  2. Существует только постфиксная форма. Префиксная форма (++i) в Go отсутствует.

    var i = 1
    i++ // OK
    // ++i // Ошибка компиляции: syntax error: unexpected ++, expecting operand
  3. Их нельзя использовать внутри других выражений. Например, в качестве аргумента функции или в условном операторе.

    // if i++ > 1 { ... } // Ошибка компиляции
    // fmt.Println(i++)   // Ошибка компиляции

Почему так сделано?

Это сознательное решение дизайнеров языка для упрощения синтаксиса и устранения целого класса багов, связанных с неочевидным порядком вычислений в сложных выражениях (например, a[i++] = i). В Go код становится более предсказуемым и читаемым: сначала вы изменяете переменную, а затем используете её новое значение в следующей строке.

Итог: В Go нет разницы между преинкрементом и постинкрементом, так как преинкремент просто не существует. Есть только постинкрементный оператор i++, который увеличивает значение переменной и ничего не возвращает.