ラムダは期待どおりに機能します:
func main() {
inc := func(x int) int { return x+1; }
}
ただし、宣言内の次の宣言は許可されていません。
func main() {
func inc(x int) int { return x+1; }
}
入れ子関数が許可されていない理由は何ですか?
ラムダは期待どおりに機能します:
func main() {
inc := func(x int) int { return x+1; }
}
ただし、宣言内の次の宣言は許可されていません。
func main() {
func inc(x int) int { return x+1; }
}
入れ子関数が許可されていない理由は何ですか?
inc()
、実際の宣言の前に2番目の例を呼び出すことができます。だが!私は理由を探しています。Goについてはよくわかりませんが、このルールの背後にあるロジックが何であったかを知りたいと思います。
回答:
この明らかな機能が許可されない理由は3つあると思います
これらは私の意見ですが、言語設計者からの公式の発表は見ていません。
確かにそうです。それらを変数に割り当てる必要があります。
func main() {
inc := func(x int) int { return x+1; }
}
var inc func(int) int
すべての言語には斬新な機能が含まれており、誰かのお気に入りの機能が省略されています。Goは、プログラミングの効率性、コンパイルの速度、概念の直交性、および並行性やガベージコレクションなどの機能をサポートする必要性を考慮して設計されました。お気に入りの機能が合わない、コンパイル速度やデザインの明瞭さに影響する、または基本的なシステムモデルが難しくなりすぎるために、お気に入りの機能が欠落している可能性があります。
Goに機能Xがないことが気になる場合は、ご容赦ください。Goにある機能を調査してください。Xの不足を興味深い方法で補うことがわかるかもしれません。
入れ子関数を追加することの複雑さと費用を正当化するものは何ですか?入れ子関数なしではできないことをyauは何をしたいですか?など。
入れ子関数と入れ子関数内の関数を実装する方法は次のとおりです
package main
import "fmt"
func main() {
nested := func() {
fmt.Println("I am nested")
deeplyNested := func() {
fmt.Println("I am deeply nested")
}
deeplyNested()
}
nested()
}
入れ子関数は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; }()
}
func main() { func (x int) int { return x+1; }(3) }