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