Middle
Забонии (closure) дар Go чист ва чӣ гуна кор мекунад?
sobes.tech AI
Ҷавоб аз AI
Дармонда дар Go — ин функсияест, ки арзиши тағйирёбандаҳоро аз муҳити лексикалӣ, ки онро муҳити атрофи он "мемонад", ҳатто пас аз он, ки он муҳит дигар вуҷуд надорад.
Принсипи кор дар он аст:
- Вақте ки дармон (масалан, дар дохили функсияи дигар) сохта мешавад, он ба ишораҳо ба тағйирёбандаҳо аз доираи истифодабарӣ, ки дар он ҷо эълон шудааст, мегирад.
- Ин ишораҳо боқӣ мемонанд, то даме, ки дармон вуҷуд дорад, ҳатто агар функсияе, ки онҳо дар он эълон шудаанд, аллакай ба анҷом расида бошад.
- Ҳар дафъа, ки дармон даъват мешавад, он метавонад ба ин тағйирёбандаҳо дастрасӣ пайдо кунад ва онҳоро тағйир диҳад.
Масал:
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 зиёд мешавад, ки ба ин нусхаи махсуси дармон тааллуқ дорад.