Junior
Jaka koncepcja jest realizowana za pomocą konstrukcji defer w języku Go?
sobes.tech AI
Odpowiedź od AI
Konstrukcja defer implementuje koncepcję odroczonego wywoływania funkcji. Odroczona funkcja jest wykonywana bezpośrednio przed zakończeniem funkcji, która ją zawiera.
Kluczowe punkty:
- Czas wykonania: Odroczona funkcja jest wykonywana na końcu funkcji nadrzędnej, nawet jeśli wystąpi panika lub wyjątek.
- Stos: Wywołania odroczone tworzą stos. Ostatnie odroczone wywołanie zostanie wykonane jako pierwsze (LIFO).
- Przechwytywanie zmiennych: Argumenty odroczonej funkcji są obliczane w momencie deklaracji
defer, a nie w momencie wykonania.
Przykłady typowego użycia:
- Zamknięcie plików, połączeń sieciowych, mutexów.
- Przywracanie stanu (np. po zmianie zmiennych globalnych lub flag).
- Pomiar czasu wykonania.
// Przykład użycia defer do zamknięcia pliku
func readFile(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close() // Plik zostanie zamknięty przed wyjściem z funkcji
// Odczyt z pliku...
return nil
}
// Przykład stosu wywołań defer
func process() {
defer fmt.Println("Pierwszy na stosie")
defer fmt.Println("Drugi na stosie")
defer fmt.Println("Trzeci na stosie") // Wykona się jako ostatni
fmt.Println("Przetwarzanie...")
}
Wywołania odroczone z argumentami:
// Przykład przechwytywania wartości zmiennej w momencie deklaracji defer
func demonstrateDeferArgEval() {
i := 0
defer fmt.Println("Wartość i w defer:", i) // i będzie 0
i++
fmt.Println("Wartość i po inkrementacji:", i) // i będzie 1
}