Nomsiz funksiyalar
Go dasturlash tilida nom berilmagan funksiyalarni yaratish mumkin. Bunday funksiyalar anonim (nomsiz) funksiyalar deb ataladi.
func() {
fmt.Println("Nomsiz funksiya")
}
Bunday funksiyalar odatda o'zgaruvchiga biriktiriladi yoki boshqa funksiyalarga argument sifatida uzatiladi.
Anonim funksiyani chaqirishning eng keng tarqalgan usuli — uni biror o'zgaruvchiga o'zlashtirish va o'sha o'zgaruvchi nomiga qavslar () qo'yib chaqirishdir:
package main
import "fmt"
func main() {
// Anonim funksiyani greet o'zgaruvchisiga o'zlashtiramiz
var greet = func() {
fmt.Println("Salom, qandaysiz?")
}
// Funksiyani chaqiramiz
greet()
}
Natija:
Salom, qandaysiz?
Oddiy funksiyalar singari, anonim funksiyalar ham tashqaridan parametrlar qabul qila oladi:
package main
import "fmt"
func main() {
// Ikkita parametr qabul qiluvchi anonim funksiya
var sum = func(n1, n2 int) {
natija := n1 + n2
fmt.Println("Yig'indi:", natija)
}
// Argumentlar uzatib chaqiramiz
sum(5, 3)
}
Natija:
Yig'indi: 8
return)Anonim funksiya parametrlar ro'yxatidan so'ng qaytarish turini ko'rsatib, natijani return qilish mumkin:
package main
import "fmt"
func main() {
var sum = func(n1, n2 int) int {
return n1 + n2
}
result := sum(5, 3)
fmt.Println("Yig'indi:", result)
}
package main
import "fmt"
func main() {
// To'rtburchak yuzini hisoblovchi anonim funksiya
area := func(length, breadth int) int {
return length * breadth
}
fmt.Println("To'rtburchak yuzasi:", area(3, 4))
}
Natija:
To'rtburchak yuzasi: 12
Go tilida funksiyalar birinchi darajali fuqarolar (first-class citizens) hisoblangani bois, anonim funksiyaning natijasini yoki funksiyaning o'zini boshqa funksiyaga argument qilib berish mumkin:
package main
import "fmt"
// Sonning kvadratini topuvchi oddiy funksiya
func findSquare(num int) int {
return num * num
}
func main() {
// Yig'indini qaytaruvchi anonim funksiya
sum := func(number1 int, number2 int) int {
return number1 + number2
}
// sum(6, 9) natijasi findSquare() ga uzatiladi
result := findSquare(sum(6, 9))
fmt.Println("Natija:", result)
}
Natija:
Natija: 225
Bu yerda dastlab sum(6, 9) ishlab 15 natijasini beradi, so'ngra findSquare(15) chaqirilib 15² = 225 natija hosil bo'ladi.
Funksiyaning qaytarish turi sifatida yana boshqa bir funksiyani belgilash mumkin:
package main
import "fmt"
// Qaytarish turi func() int bo'lgan funksiya
func displayNumber() func() int {
number := 10
// Ichki anonim funksiyani qaytaramiz
return func() int {
number++
return number
}
}
func main() {
a := displayNumber()
fmt.Println(a()) // 11
}
Bu yerda displayNumber() chaqirilganda, u ichidagi anonim funksiyani qaytaradi. So'ng a() orqali o'sha qaytarilgan funksiyani ishlatamiz. Bu mexanizm keyingi mavzudagi Closure (yopilishlar) ning poydevori hisoblanadi.