Žodynas: raktas → reikšmė ir comma-ok
Sąrašas atsako į klausimą „koks 3-ias įrašas?". Bet tikros programos klausia kitaip: „kiek įrašų istorijos kategorijoje?", „kuris įrašas turi šį tikslų pavadinimą?". Kaskart peržiūrėti visą sąrašą lėta ir nepatogu. Žodynas (map) atsako pagal raktą — akimirksniu.
Įsivaizduok popierinį žodyną: neskaitai kiekvieno puslapio — atsiverti tiesiai reikiamą žodį. Go map toks pat: raktas → reikšmė lentelė.
Kuriam su make:
ages := make(map[string]int) // raktas: string, reikšmė: int — iš pradžių tuščias
ages["Jonas"] = 30 // įrašom
ages["Rūta"] = 25
fmt.Println(ages["Jonas"]) // 30 — skaitom pagal raktą
map[string]int skaitosi iš kairės į dešinę: žodynas, kurio raktai yra string, o reikšmės — int. Raktai gali būti bet koks palyginamas tipas (string, int…); reikšmės — bet kas, net struktūra: map[string]Item.
Spąstai: nesamas raktas nelaužia programos — grąžina nulinę reikšmę.
fmt.Println(ages["Niekas"]) // 0 — NE klaida, tiesiog int nulinė reikšmė
Taigi ages["Niekas"] duoda 0, o map[string]string nesamam raktui — "". Patogu, bet reiškia, kad neatskirsi „reikšmė tikrai 0" nuo „rakto nėra". Tam Go turi comma-ok idiomą:
age, ok := ages["Rūta"]
if ok {
fmt.Println("Rūtai", age) // ok == true → raktas yra
} else {
fmt.Println("nėra tokio") // ok == false → nėra
}
Skaityk taip: „duok reikšmę ir ar ji buvo." v, ok := m[k] naudosi nuolat — tai saugus būdas ką nors surasti.
Skaičiavimas — viena eilutė. Kadangi nesamas raktas skaitosi kaip 0, gali ++ iš karto:
counts := make(map[string]int)
counts["istorija"]++ // istorijos nebuvo → 0, tada +1 → 1
counts["istorija"]++ // dabar 2
Jokio „ar jau yra?" tikrinimo — nulinė reikšmė padaro darbą. Šis mažas šablonas — šios pamokos programos širdis.
Šalink raktą su delete, skaičiuok su len:
delete(ages, "Jonas") // pašalinta; nesamo rakto šalinimas — saugus tuščias veiksmas
fmt.Println(len(ages)) // kiek raktų žodyne
Toliau: kaip pereiti per kiekvieną įrašą su range — ir viena staigmena, kurią Go ten paruošęs.