Lambdas bekerja seperti yang diharapkan:
func main() {
inc := func(x int) int { return x+1; }
}
Namun, pernyataan berikut di dalam deklarasi tidak diperbolehkan:
func main() {
func inc(x int) int { return x+1; }
}
Untuk alasan apa fungsi bertingkat tidak diizinkan?
function
go
declaration
corazza.dll
sumber
sumber
func main() { func (x int) int { return x+1; }(3) }
inc()
contoh kedua sebelum deklarasi sebenarnya. Tapi! Saya mencari alasan, saya tidak tahu banyak tentang Go, tetapi saya ingin mempelajari logika di balik aturan ini.Jawaban:
Saya rasa ada 3 alasan mengapa fitur yang jelas ini tidak diperbolehkan
Itu hanya pendapat saya - saya belum melihat pernyataan resmi dari desainer bahasa.
sumber
Tentu mereka. Anda hanya perlu menetapkannya ke variabel:
func main() { inc := func(x int) int { return x+1; } }
sumber
var inc func(int) int
Apa yang membenarkan kerumitan dan biaya penambahan fungsi bersarang? Apa yang ingin Anda lakukan yang tidak dapat Anda lakukan tanpa fungsi bertingkat? Dan lain-lain.
sumber
Berikut cara untuk mengimplementasikan fungsi dan fungsi bertingkat dalam fungsi bertingkat
package main import "fmt" func main() { nested := func() { fmt.Println("I am nested") deeplyNested := func() { fmt.Println("I am deeply nested") } deeplyNested() } nested() }
sumber
Fungsi bertingkat diperbolehkan di Go. Anda hanya perlu menetapkannya ke variabel lokal di dalam fungsi luar, dan memanggilnya menggunakan variabel tersebut.
Contoh:
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")
Fungsi bagian dalam sering kali berguna untuk goroutine lokal:
func outerFunction(...) { innerFunction := func(...) { ... } go innerFunction(...) }
sumber
Anda hanya perlu segera memanggilnya dengan menambahkan di
()
bagian akhir.func main() { func inc(x int) int { return x+1; }() }
Sunting: tidak dapat memiliki nama fungsi ... jadi itu hanya fungsi lambda yang dipanggil langsung:
func main() { func(x int) int { return x+1; }() }
sumber