Dalybos spąstai — 0% perskaitytos knygos
Dabar — klaida, kuri neatrodo kaip klaida. Tarkim, perskaitei 190 puslapių iš 380 ir nori pažangos procentais:
progress := it.PagesRead / it.Pages * 100
fmt.Println("Progress:", progress, "%")
Rezultatas:
Progress: 0 %
Nulis procentų. Pusę knygos perskaitei, o programa sako 0 — ir jokios klaidos, jokio įspėjimo. Kodėl? PagesRead ir Pages — abu int, o int dalyba meta liekaną: 190 / 380 = 0 (sveikoji dalis), tada 0 * 100 = 0. Programa suskaičiavo „teisingai" — pagal int taisykles.
Vaistas — aiškus konvertavimas į float64 PRIEŠ dalybą:
progress := float64(it.PagesRead) / float64(it.Pages) * 100
fmt.Printf("Progress: %.1f%%\n", progress)
Progress: 50.0%
Go niekada nekonvertuoja tipų tyliai — int netaps float64 pats. Tai atrodo pedantiška, bet būtent todėl klaida visada matoma kode: kur nėra float64(...), ten dalyba sveikoji.
Trumpai apie simbolius: string viduje gyvena baitai; rune — vienas Unicode simbolis. len("ąžuolas") grąžina baitus (9), ne raides (7) — lietuviškos raidės užima po 2 baitus. Jei kada skaičiuosi raides — len([]rune(s)).
Spąstai. Int dalybos klaida pavojinga tuo, kad tyli: išlaidų vidurkis, reitingo vidurkis, procentai — visi „veikia", tik rodo neteisingą atsakymą. Taisyklė: pamačius
/paklausk savęs — ar man čia reikia liekanos atmetimo? Jei ne, konvertuok įfloat64prieš dalybą (ne po:float64(a/b)jau per vėlu — dalyba įvyko int pasaulyje).