Junior
Ի՞նչ կոնցեպտ է իրականացվում Go լեզվում defer կառուցվածքի միջոցով։
sobes.tech AI
Պատասխան AI-ից
defer կառուցվածքը իրականացնում է հետաձգված գործառույթի կատարման կոնցեպցիան։ Հետաձգված գործառույթը կատարվում է անմիջապես այն ավարտելուց առաջ, որը պարունակում է defer-ը:
Հիմնական կետեր՝
- Կատարման ժամանակը: Հետաձգված գործառույթը կատարվում է ծնողական գործառույթի վերջում, նույնիսկ եթե տեղի ունենա панիկ կամ արտառոցություն:
- Stack: Հետաձգված կանչերը ձևավորում են stack։ Վերջին հետաձգված կանչը կատարվելու է առաջինը (LIFO):
- Փոփոխականների բռնում: Հետաձգված գործառույթի արգումենտները հաշվարկվում են
defer-ի հայտարարելու պահին, ոչ թե կատարման ժամանակ:
Տիպիկ օգտագործման օրինակներ՝
- Ֆայլերի, ցանցային կապերի, mutex-ների փակումը:
- Կարգավիճակի վերականգնում (օրինակ՝ գլոբալ փոփոխականների կամ նշանների փոփոխությունից հետո):
- Կատարման ժամանակի չափում:
// Օրինակ `defer`-ի օգտագործման ֆայլը փակելու համար
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Ֆայլը կփակվի ֆունկցիայի ավարտից առաջ
// Ֆայլից ընթերցում...
return nil
}
// `defer`-ի կանչերի stack-ի օրինակ
func process() {
defer fmt.Println("Առաջինը stack-ում")
defer fmt.Println("Երկրորդը stack-ում")
defer fmt.Println("Երրորդը stack-ում") // Կատարվելու է վերջինը
fmt.Println("Գործընթաց...")
}
Հետաձգված կանչեր արգումենտներով:
// Օրինակ՝ արժեքը բռնելու համար փոփոխականի` defer հայտարարելու պահին
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("i արժեքը defer-ում:", i) // i կլինի 0
i++
fmt.Println("i արժեքը ավելացնելուց հետո:", i) // i կլինի 1
}