Edit: Se não ficou claro o que eu estava perguntando: quais são os problemas que são mitigados por não permitir declarações de funções aninhadas?
Lambdas funcionam conforme o esperado:
func main() {
inc := func(x int) int { return x+1; }
}
No entanto, a seguinte declaração dentro de uma declaração não é permitida:
func main() {
func inc(x int) int { return x+1; }
}
Por que razão as funções aninhadas não são permitidas?
function
go
declaration
Corazza
fonte
fonte
func main() { func (x int) int { return x+1; }(3) }
inc()
o segundo exemplo antes da declaração real. Mas! Estou procurando razões, não sei muito sobre Go, mas gostaria de saber qual era a lógica por trás dessa regra.Respostas:
Acho que há três razões pelas quais esse recurso óbvio não é permitido
Essas são apenas minhas opiniões - eu não vi um pronunciamento oficial dos designers da linguagem.
fonte
Claro que estão. Você só precisa atribuí-los a uma variável:
func main() { inc := func(x int) int { return x+1; } }
fonte
O que justificaria a complexidade e o custo de adicionar funções aninhadas? O que você quer fazer que não pode fazer sem funções aninhadas? Et cetera.
fonte
Esta é uma maneira de implementar funções aninhadas e funções dentro de funções aninhadas
package main import "fmt" func main() { nested := func() { fmt.Println("I am nested") deeplyNested := func() { fmt.Println("I am deeply nested") } deeplyNested() } nested() }
fonte
nested
dentrodeeplyNested
;)Funções aninhadas são permitidas no Go. Você só precisa atribuí-los a variáveis locais dentro da função externa e chamá-los usando essas variáveis.
Exemplo:
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")
As funções internas costumam ser úteis para goroutines locais:
func outerFunction(...) { innerFunction := func(...) { ... } go innerFunction(...) }
fonte
Você apenas tem que chamá-lo imediatamente adicionando
()
ao final.func main() { func inc(x int) int { return x+1; }() }
Editar: não pode ter nome de função ... então é apenas uma função lambda sendo chamada imediatamente:
func main() { func(x int) int { return x+1; }() }
fonte