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