Sobes.tech
Junior — Middle

Jaki jest wynik przypisania wartości do zmiennej przy użyciu konstrukcji defer, gdy jej wartość jest ustawiana wewnątrz funkcji?

sobes.tech AI

Odpowiedź od AI

W języku Go słowo kluczowe defer opóźnia wykonanie funkcji do momentu wyjścia z funkcji otaczającej. Argumenty funkcji przekazanej do defer są obliczane natychmiast w momencie deklaracji defer, a nie podczas jej wykonania.

Jeśli zmienna jest używana wewnątrz funkcji wywoływanej przez defer, to wartość tej zmiennej będzie ta, która była w momencie deklaracji defer, jeśli została przekazana jako argument. Jeśli zmienna jest używana bezpośrednio (np. przez zamknięcie), to zostanie użyta jej aktualna wartość w momencie wykonania opóźnionej funkcji.

Przykład:

func przykład() {
    x := 1
    defer fmt.Println(x) // x będzie 1, ponieważ argument jest obliczany od razu
    x = 2
}

// Przy wywołaniu przykład(), zostanie wyświetlone: 1

Jeśli użyjemy zamknięcia:

func przykład() {
    x := 1
    defer func() { fmt.Println(x) }() // funkcja zostanie wywołana przy wyjściu, x będzie 2
    x = 2
}

// Przy wywołaniu przykład(), zostanie wyświetlone: 2

W ten sposób, wynik przypisania do zmiennej w defer zależy od tego, jak zmienna jest używana — jako argument funkcji czy przez zamknięcie.