Sobes.tech
Junior — Middle

Koji je rezultat dodeljivanja vrednosti promenljivoj koristeći konstrukciju defer, kada se njena vrednost postavlja unutar funkcije?

sobes.tech АИ

Одговор од АИ

U jeziku Go, ključna reč defer odlaže izvršenje funkcije do izlaska iz okružujuće funkcije. Argumenti funkcije prosleđene defer-u se odmah evaluiraju u trenutku deklaracije defer, a ne tokom izvršenja.

Ako se promenljiva koristi unutar funkcije pozvane putem defer, vrednost te promenljive će biti ona u trenutku deklaracije defer, ako je prosleđena kao argument. Ako se promenljiva koristi direktno (npr. putem zatvaranja), koristiće se njena trenutna vrednost u trenutku izvršenja odložene funkcije.

Primer:

func primer() {
    x := 1
    defer fmt.Println(x) // x će biti 1, jer je argument odmah evaluiran
    x = 2
}

// Pri pozivu primer(), biće ispisano: 1

Ako se koristi zatvaranje:

func primer() {
    x := 1
    defer func() { fmt.Println(x) }() // funkcija će biti pozvana pri izlasku, x će biti 2
    x = 2
}

// Pri pozivu primer(), biće ispisano: 2

Tako, rezultat dodele promenljive u defer zavisi od toga kako se promenljiva koristi — kao argument funkcije ili putem zatvaranja.