Junior
Go tilida defer konstruktsiyasi bilan qanday konsept amalga oshiriladi?
sobes.tech AI
AIdan javob
defer qurilishi funksiyaning kechiktirilgan bajarilishini amalga oshiradi. Kechiktirilgan funksiya defer bilan belgilangan joyda, funksiyaning yakunidan oldin bajariladi.
Asosiy nuqtalar:
- Bajarilish vaqti: Kechiktirilgan funksiya ota funksiyaning oxirida bajariladi, hatto panika yoki istisno yuzaga kelsa ham.
- Stack: Kechiktirilgan chaqiruvlar stack hosil qiladi. Oxirgi kechiktirilgan chaqiruv birinchi bajariladi (LIFO).
- O'zgaruvchilarni ushlash: Kechiktirilgan funksiyaning argumentlari
defere'lon qilinish vaqti hisoblanadi, bajarilish vaqti emas.
Tipik foydalanish misollari:
- Fayllarni, tarmoq ulanishlarini, mutexlarni yopish.
- Holatni tiklash (masalan, global o'zgaruvchilar yoki flaglarni o'zgartirgandan so'ng).
- Bajarilish vaqtini o'lchash.
// Faylni yopish uchun defer misoli
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Fayl funksiyadan chiqishdan oldin yopiladi
// Fayldan o'qish...
return nil
}
// Defer chaqiruvlar stacki misoli
func process() {
defer fmt.Println("Birinchi stackda")
defer fmt.Println("Ikkinchi stackda")
defer fmt.Println("Uchinchi stackda") // Oxirgi bajariladi
fmt.Println("Qayta ishlash...")
}
Argümanlar bilan kechiktirilgan chaqiruvlar:
// Defer e'lon qilish vaqti bilan o'zgaruvchining qiymatini ushlash misoli
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Defer'da i ning qiymati:", i) // i 0 bo'ladi
i++
fmt.Println("Inkrementdan keyin i ning qiymati:", i) // i 1 bo'ladi
}