Sobes.tech
Middle

Забонии (closure) дар Go чист ва чӣ гуна кор мекунад?

sobes.tech AI

Ҷавоб аз AI

Дармонда дар Go — ин функсияест, ки арзиши тағйирёбандаҳоро аз муҳити лексикалӣ, ки онро муҳити атрофи он "мемонад", ҳатто пас аз он, ки он муҳит дигар вуҷуд надорад.

Принсипи кор дар он аст:

  1. Вақте ки дармон (масалан, дар дохили функсияи дигар) сохта мешавад, он ба ишораҳо ба тағйирёбандаҳо аз доираи истифодабарӣ, ки дар он ҷо эълон шудааст, мегирад.
  2. Ин ишораҳо боқӣ мемонанд, то даме, ки дармон вуҷуд дорад, ҳатто агар функсияе, ки онҳо дар он эълон шудаанд, аллакай ба анҷом расида бошад.
  3. Ҳар дафъа, ки дармон даъват мешавад, он метавонад ба ин тағйирёбандаҳо дастрасӣ пайдо кунад ва онҳоро тағйир диҳад.

Масал:

package main

import "fmt"

func makeCounter() func() int {
	count := 0 // Тағйирёбандаи муҳити беруна
	return func() int { // Ин дармон аст
		count++ // Ба `count` дастрасӣ пайдо мекунад ва онро тағйир медиҳад
		return count
	}
}

func main() {
	counter1 := makeCounter()
	fmt.Println(counter1()) // 1-ро мебарорад
	fmt.Println(counter1()) // 2-ро мебарорад

	counter2 := makeCounter() // Дармон нав бо `count`-и худ эҷод мекунад
	fmt.Println(counter2()) // 1-ро мебарорад
}

Дар ин мисол, функсияи makeCounter функсия (дармон) бармегардонад. Ин дармон "таърифи" тағйирёбандаи count-ро мегирад. Ҳар дафъа, ки функсияи баргардонидашуда даъват мешавад, арзиши count зиёд мешавад, ки ба ин нусхаи махсуси дармон тааллуқ дорад.