Junior
რა კონცეფცია ხორციელდება Go ენის defer კონსტრუქციით?
sobes.tech AI
პასუხი AI-სგან
defer курулушу функциянын кечиктирилген аткаруу концепциясын ишке ашырат. Кечиктирилген функция defer менен белгиленген функциянын аяктоо алдында түз аткарылат.
Негизги пункттар:
- Ишке ашыруу убактысы: Кечиктирилген функция ата-энесинин функциясынын акырында аткарылат, даже эгер паника же ката болсо да.
- 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
}
// Кечиктирилген чакыруулар стекинин мисалы
func process() {
defer fmt.Println("Биринчи стекте")
defer fmt.Println("Экинчи стекте")
defer fmt.Println("Үчүнчү стекте") // Соңку болуп аткарылат
fmt.Println("Иштетүү...")
}
Аргументтери менен кечиктирилген чакыруулар:
// `defer` декларациясынын учурунда өзгөрмөнүн маанисин кармоо мисалы
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("deferдеги i мааниси:", i) // i 0 болот
i++
fmt.Println("Ининкременттен кийин i мааниси:", i) // i 1 болот
}