Подтвердить что ты не робот

Почему не разрешать вложенные объявления функций (функции внутри функций)?

Изменить: если было непонятно, что я спрашивал: какие проблемы устраняются, если не разрешать вложенные объявления функций?

Lambdas работает так, как ожидалось:

func main() {
    inc := func(x int) int { return x+1; }
}

Однако, следующее объявление внутри объявления не допускается:

func main() {
    func inc(x int) int { return x+1; }
}

По какой причине вложенные функции не разрешены?

4b9b3361

Ответ 1

Я думаю, что есть 3 причины, почему эта очевидная функция не разрешена

  • Это затруднит компилятор. В настоящий момент компилятор знает, что все функции находятся на верхнем уровне.
  • Это сделает новый класс ошибок программиста - вы могли бы реорганизовать что-то и случайно заложить некоторые функции.
  • Наличие другого синтаксиса для функций и закрытий - это хорошо. Закрытие потенциально более дорогостоящее, чем выполнение функции, поэтому вы должны знать, что делаете это.

Это только мои мнения - я не видел официального заявления от разработчиков языка.

Ответ 2

Часто задаваемые вопросы (FAQ)

Почему у Go нет функции X?

Каждый язык содержит новые функции и пропускает кого-то любимого особенность. Go был разработан с учетом счастья программирования, скорости компиляции, ортогональности понятий и необходимости поддержки такие функции, как concurrency и сбор мусора. Ваш любимый может отсутствовать функция, потому что она не подходит, поскольку она затрагивает скорости компиляции или ясности дизайна, или потому, что это сделало бы фундаментальная системная модель слишком сложна.

Если вы беспокоитесь о том, что Go отсутствует функция X, пожалуйста, простите нас и исследовать функции, которые Go имеет. Вы можете обнаружить, что они компенсировать интересными способами отсутствие Х.

Что оправдывало бы сложность и затраты на добавление вложенных функций? Что делать yau, чтобы вы не могли обойтись без вложенных функций? Et cetera.

Ответ 3

Конечно. Вам просто нужно назначить их переменной:

func main() {
    inc := func(x int) int { return x+1; }
}