Tema
/
Struktūrinis programavimas GO
Pamoka 9 / 14 Žodynas (Go map) ~50 min
📖 Teorija

Ž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.