Ova tri ključna pojma rukuju odgodom izvršavanja i izuzetnim situacijama. defer raspoređuje čišćenje, panic izaziva srušavanje tijekom izvršavanja (za doista iznimne slučajeve), a recover može uhvatiti panic kako bi se programa od rušenja.
Ova tri ključna pojma rukuju odgodom izvršavanja i izuzetnim situacijama. defer raspoređuje čišćenje, panic izaziva srušavanje tijekom izvršavanja (za doista iznimne slučajeve), a recover može uhvatiti panic kako bi se programa od rušenja.
func readFile() error {
f, err := os.Open("file.txt")
if err != nil { return err }
defer f.Close() // GUARANTEED to run when readFile returns (any path)
// ... use f, with multiple return points ...
return nil // f.Close() runs here automatically
}
defer raspoređuje poziv funkcije za izvršavanje kada se okružujuća funkcija vrati — bez obzira kako se vrati (normalnim povratom, greškom ili panickom). To je idiomatski način da se osigura čišćenje: zatvaranje datoteka, otključavanje muteksa, zatvaranje konekcija — postavljeno odmah pored dohvaćanja kako ga ne bi moglo zaboraviti.
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
// prints: 3, 2, 1 — last deferred, first executed (stack order)
func mustPositive(n int) {
if n < 0 {
panic("negative not allowed") // stops normal execution, unwinds the stack
}
}
// panic runs deferred functions as it unwinds, then crashes the program (with a stack trace)
panic zaustavlja normalan tok i razmatuje zov stog (pri čemu se izvršavaju odgođene funkcije), na kraju rušeći program. Namijenjen je greškama programera / nepopravljive stanja (van granica, nil dereferencija, nemoguća stanja) — NIJE za obične greške (one koriste vraćene error vrijednosti).
func safeProcess() {
defer func() {
if r := recover(); r != nil { // recover() returns the panic value
fmt.Println("recovered from:", r) // handle it; program continues
}
}()
panic("something broke") // this panic is caught by the recover above
}
// safeProcess returns normally instead of crashing
recover vraća kontrolu goroutini koja je u panici — ali funkcionira samo unutar odgođene funkcije. Koristi se rijetko, npr. kako bi se sprječilo da jedan rukovalac zahtjevom srusi cijeli server.
Normal/expected failures (file missing, bad input, validation) → return an error value
panic/recover → reserve for TRULY exceptional cases (bugs, unrecoverable states)
and boundaries (e.g. a server recovering so one bad request doesn't kill the process)
defer je bitna, idiomatska Go značajka za zajamčeno čišćenje — postavljanje oslobađanja resursa odmah pored dohvaćanja i osiguravanje da se izvršava na svakom povratnom putu (uključujući panike), što sprječava curjenja datoteka, brava i konekcija puno pouzdanije od ručnog čišćenja.
Razumijevanje njegovog LIFO redoslijeda je važno. panic/recover pružaju mehanizam sličan iznimkama, ali kritično načelo je da Go ih rezervira za doista iznimne, nepopravljive situacije — obične greške trebaju se uvijek vratiti kao vrijednosti i provjeriti.
Zloupotreba panic/recover kao općeg rukovanja iznimkama nije idiomatska i česta je greška programera koji dolaze iz jezika temeljenih na iznimkama.
Znati kada koristiti defer (uvijek, za čišćenje), error povrate (obične neuspjehe) i panic/recover (rijetko, iznimno ili na granicama) temeljno je za pisanje ispravnog, idiomatskog Go-a i čest je tema u intervjuima.