Struktūrinis programavimas
Pamoka 7 / 11 Masyvai ir įrašų slice ~40 min
2 / 4 📖 Teorija

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.