Изменить: если было неясно, о чем я спрашивал: какие проблемы можно смягчить, запретив декларации вложенных функций?
Лямбды работают должным образом:
func main() {
inc := func(x int) int { return x+1; }
}
Однако следующее объявление внутри объявления не допускается:
func main() {
func inc(x int) int { return x+1; }
}
По какой причине нельзя использовать вложенные функции?
function
go
declaration
Corazza
источник
источник
func main() { func (x int) int { return x+1; }(3) }
inc()
второй пример до фактического объявления. Но! Я ищу причины, я мало знаю о Go, но хотел бы узнать, в чем заключалась логика этого правила.Ответы:
Я думаю, что есть 3 причины, по которым эта очевидная функция не разрешена
Это всего лишь мое мнение - я не видел официального заявления разработчиков языка.
источник
Конечно, есть. Вам просто нужно присвоить их переменной:
func main() { inc := func(x int) int { return x+1; } }
источник
Чем можно оправдать сложность и дороговизну добавления вложенных функций? Что вы хотите сделать из того, что не можете сделать без вложенных функций? И так далее.
источник
Вот способ реализовать вложенные функции и функции внутри вложенных функций
package main import "fmt" func main() { nested := func() { fmt.Println("I am nested") deeplyNested := func() { fmt.Println("I am deeply nested") } deeplyNested() } nested() }
источник
nested
внутрьdeeplyNested
;)В Go разрешены вложенные функции. Вам просто нужно назначить их локальным переменным во внешней функции и вызывать их с использованием этих переменных.
Пример:
func outerFunction(iterations int, s1, s2 string) int { someState := 0 innerFunction := func(param string) int { // Could have another nested function here! totalLength := 0 // Note that the iterations parameter is available // in the inner function (closure) for i := 0; i < iterations; i++) { totalLength += len(param) } return totalLength } // Now we can call innerFunction() freely someState = innerFunction(s1) someState += innerFunction(s2) return someState } myVar := outerFunction(100, "blah", "meh")
Внутренние функции часто удобны для локальных горутин:
func outerFunction(...) { innerFunction := func(...) { ... } go innerFunction(...) }
источник
Просто надо сразу его вызвать, добавив
()
в конец.func main() { func inc(x int) int { return x+1; }() }
Изменить: не может иметь имя функции ... так что сразу вызывается просто лямбда-функция:
func main() { func(x int) int { return x+1; }() }
источник