Sobes.tech
Senior

Co wyświetli ten kod i dlaczego? ```go package main import "fmt" func main() { lst := []string{"a", "b", "c", "d"} for k, v := range lst { if k == 0 { lst = []string{"aa", "bb", "cc", "dd"} } fmt.Println(v) } } ```

sobes.tech AI

Odpowiedź od AI

Kod wyświetli:


a
b
c
d

Dlaczego:

W Go, gdy używasz for k, v := range lst, slice lst jest kopiowany przez referencję, ale iterator działa na oryginalnym slice, który istniał w momencie rozpoczęcia pętli. Zmiana zmiennej lst wewnątrz pętli nie wpływa na iterację.

To znaczy, gdy wchodzisz do pętli, lst zawiera {"a", "b", "c", "d"}, i to na tym slice odbywa się iteracja. Przypisanie lst wewnątrz pętli nie zmienia zbioru elementów, po których następuje iteracja.

Jeśli chcesz, aby zmiany w slice wpływały na pętlę, powinieneś użyć innego podejścia, na przykład pętli z indeksami lub ponownego uruchomienia pętli.

Przykład:

for i := 0; i < len(lst); i++ {
    if i == 0 {
        lst = []string{"aa", "bb", "cc", "dd"}
    }
    fmt.Println(lst[i])
}

W tym przypadku wyjście będzie inne i może spowodować panic, jeśli długość się zmieni.