Sobes.tech
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:

  1. Yopilish (masalan, boshqa funktsiya ichida) yaratilganda, u e'lon qilingan doira ichidagi o'zgaruvchilarga havolalarni tutib oladi.
  2. Bu tutib olingan o'zgaruvchilar yopilish mavjud bo'lsa, umr davomida yashaydi, hatto ularni e'lon qilgan funktsiya allaqachon tugagan bo'lsa ham.
  3. 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.