Sobes.tech
Junior — Middle

Натиҷаии таъин кардани арзиш ба тағирёте бо истифода аз сохтори defer чист, вақте ки арзиши он дар дохили функсия муайян карда мешавад؟

sobes.tech AI

Ҷавоб аз AI

Дар забони Go калиди калидии defer иҷрои функсияро то вақти баромадан аз функсияи муҳитиаш ба таъхир мепазирад. Аргументҳои функсияи додаи ба defer фавран дар вақти эълон кардани defer арзёбӣ мешаванд, на дар вақти иҷро.

Агар тағйирёбанда дар дохили функсияе, ки тавассути defer даъват мешавад, истифода шавад, арзиши тағйирёбанда он вақт дар вақти эълон кардани defer хоҳад буд, агар ҳамчун аргумент дода шавад. Агар тағйирёбанда мустақиман истифода шавад (масалан, тавассути пӯшиш), арзиши ҳозираи он дар вақти иҷрои функсияи таъхиршуда истифода мешавад.

Масал:

func мисол() {
    x := 1
    defer fmt.Println(x) // x 1 хоҳад буд, зеро аргумент фавран арзёбӣ шудааст
    x = 2
}

// Вақте ки мисол() даъват мешавад, мебарояд: 1

Агар пӯшиш истифода шавад:

func мисол() {
    x := 1
    defer func() { fmt.Println(x) }() // функсия дар вақти баромад даъват мешавад, x 2 хоҳад буд
    x = 2
}

// Вақте ки мисол() даъват мешавад, мебарояд: 2

Бинобар ин, натиҷаи таъин кардани тағйирёбанда дар defer вобаста аст аз он, ки тағйирёбанда чӣ гуна истифода мешавад — ҳамчун аргументи функсия ё тавассути пӯшиш.