Junior
Консепти ки бо истифода аз сохтори defer дар забони Go амалӣ мешавад, чист?
sobes.tech AI
Ҷавоб аз AI
Конструксияи defer консепсияи иҷрои таъхирдоштаро амалӣ мекунад. Функсияи таъхирдоштаро дар дақиқаи пеш аз анҷоми функсияи дарунсохт иҷро мекунад.
Мавқеи калидӣ:
- Вақти иҷро: Функсияи таъхирдоштаро дар охири функсияи падар иҷро мекунад, ҳатто агар паника ё истисно рух диҳад.
- Стек: Зангҳои таъхирдоштаро стек месозад. Зангҳои охирин аввал иҷро мешаванд (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
func process() {
defer fmt.Println("Аввал дар стек")
defer fmt.Println("Дуввум дар стек")
defer fmt.Println("Сеюм дар стек") // Баъд иҷро мешавад
fmt.Println("Коркард...")
}
Зангҳои таъхирдоштаро бо аргументҳо:
// Мисол барои гирифтани арзиши тағйирёбанда дар вақти эълон кардани defer
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Арзиши i дар defer:", i) // i хоҳад буд 0
i++
fmt.Println("Арзиши i пас аз инкремент:", i) // i хоҳад буд 1
}