Middle
Go tilida yopilish (closure) nima va uning qanday ishlash prinsipi bor?
sobes.tech AI
AIdan javob
Go'da yopilish, uning atrof-muhitidagi o'zgaruvchilar qiymatini "eslaydigan" funktsiya bo'lib, hatto bu muhit mavjud bo'lib qolganidan keyin ham.
Ishlash prinsipi quyidagicha:
- Yopilish (masalan, boshqa funktsiya ichida) yaratilganda, u e'lon qilingan doira ichidagi o'zgaruvchilarga havolalarni tutib oladi.
- Bu tutib olingan o'zgaruvchilar yopilish mavjud bo'lsa, umr davomida yashaydi, hatto ularni e'lon qilgan funktsiya allaqachon tugagan bo'lsa ham.
- Har safar yopilish chaqirilganda, u ushbu tutib olingan o'zgaruvchilarga murojaat qilishi va ularni o'zgartirishi mumkin.
Misol:
package main
import "fmt"
func makeCounter() func() int {
count := 0 // Tashqi muhitdagi o'zgaruvchi
return func() int { // Bu yopilish
count++ // `count` ga murojaat qiladi va uni o'zgartiradi
return count
}
}
func main() {
counter1 := makeCounter()
fmt.Println(counter1()) // 1 chiqaradi
fmt.Println(counter1()) // 2 chiqaradi
counter2 := makeCounter() // Yangi yopilish yaratamiz o'zining `count` bilan
fmt.Println(counter2()) // 1 chiqaradi
}
Ushbu misolda, makeCounter funktsiyasi funktsiya (yopilish) qaytaradi. Bu yopilish count o'zgaruvchini "tutib" oladi. Har safar qaytarilgan funktsiya chaqirilganda, count ning qiymati oshiriladi, bu esa ushbu yopilishning aniq bir nusxasiga tegishli.