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.