Sobes.tech
Senior

Wat zal deze code tonen en waarom? ```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

Antwoord van AI

De code zal het volgende weergeven:


a
b
c
d

Waarom:

In Go, wanneer je for k, v := range lst gebruikt, wordt de slice lst gekopieerd op referentie, maar de iterator werkt op de oorspronkelijke slice die op het moment van de start van de lus bestond. Het wijzigen van de variabele lst binnen de lus beïnvloedt de iteratie niet.

Dat wil zeggen, bij het ingaan van de lus bevat lst {"a", "b", "c", "d"}, en wordt over deze slice geïtereerd. Het opnieuw toewijzen van lst binnen de lus verandert de set elementen waarover wordt doorlopen niet.

Als je wilt dat wijzigingen aan de slice de lus beïnvloeden, moet je een andere aanpak gebruiken, bijvoorbeeld een lus met indices of de lus opnieuw starten.

Voorbeeld:

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

In dit geval zal de output anders zijn en kan een panic optreden als de lengte verandert.