Sobes.tech
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 болот
}