range ir kopijos spąstai vėl
Eiti per visą lentyną — range:
for i, it := range items {
fmt.Printf("%2d. %s\n", i+1, formatItem(it))
}
range kiekvienam įrašui duoda indeksą (i, nuo 0) ir reikšmę (it). Žmonėms numeruojam nuo 1 — todėl spausdinam i+1. Jei indekso nereikia — for _, it := range items.
Bet čia tyko sena pažįstama klaida. Pabandyk pažymėti VISAS knygas skaitytomis:
for _, it := range items {
it.Read = true // changes only the COPY!
}
// items — nepasikeitė nė vienas įrašas
Niekas nepasikeitė. Skamba pažįstamai? Tai 3 pamokos kopijos spąstai, tik dabar — cikle: range kiekvieną elementą nukopijuoja į it. Keiti kopiją — originalas lentynoje lieka koks buvęs.
Teisingas kelias — keisti per indeksą, tiesiai lentynoje:
for i := range items {
items[i].Read = true // the REAL element changes
}
items[i] — ne kopija, o pats elementas. Įsimink porą: skaitai — for _, it := range; keiti — for i := range + items[i].
Spąstai.
for _, it := range items { it.Read = true }sukompiliuos, paleis ir... nieko nepadarys (naujesnis Go net įspės „unused variable" tik kartais). Tyli klaida kaip int dalyba 6 pamokoje. Jei po ciklo pokyčių nesimato — pirmiausia patikrink, ar nekeiti range kopijos.