Sobes.tech
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
}