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 зависи от начина, по който се използва променливата — като аргумент на функция или чрез затваряне.