Kaip veikia Map duomenų tipas Go?
sobes.tech AI
Atsakymas iš AI
Žemėlapis — tai neaprašyta porų "raktas-reikšmė" kolekcija Go kalboje.
Ypatybės:
- Raktai turi būti palyginami duomenų tipai (skaičiai, eilutės, loginiai, rodyklės, kanalai, sąsajos, jei dinaminis tipas yra palyginamas, ir masyvai, jei jų elementai yra palyginami). Sriegių masyvai, funkcijos ir kiti žemėlapiai negali būti naudojami kaip raktai.
- Reikšmės gali būti bet kurio tipo.
- Žemėlapis yra nuorodinis tipas, tai reiškia, kad žemėlapio tipo kintamasis saugo nuorodą į žemėlapio duomenų struktūrą atmintyje. Pakeitimai per vieną kintamąjį bus matomi ir kitų, kurie nurodo tą patį žemėlapį.
- Nulinė reikšmė žemėlapiui yra
nil.nilžemėlapio rašyti negalima, bandymas rašyti sukels paniką. - Žemėlapio dydis dinamiškai keičiasi, pridedant ar pašalinant elementus.
Vidinė įgyvendinimas: Žemėlapis Go kalboje įgyvendintas kaip maišos lentelė (hash table). Kiekvienas raktas yra maišos funkcija, ir maišos rezultatas naudojamas nustatyti, kurioje lentelės vietoje yra susijusi reikšmė.
// Žemėlapio kūrimas
m := make(map[string]int)
// Elementų pridėjimas
m["vienas"] = 1
m["du"] = 2
// Reikšmės gavimas
value, ok := m["vienas"] // value = 1, ok = tiesa
value, ok = m["trys"] // value = 0 (int tipo nulinė reikšmė), ok = klaidinga
// Elemento pašalinimas
delete(m, "du")
// Žemėlapio iteracija (tvarkos garantijos nėra)
for raktas, reikšmė := range m {
// ...
}
Žemėlapių palyginimas: du žemėlapiai laikomi lygiais, jei jie nurodo tą pačią vidinę struktūrą, t.y., map1 == map2 tik tada, kai map1 ir map2 yra tas pats kintamasis. Žemėlapio turinys negali būti lyginamas operatoriumi ==. Turinys turi būti lyginamas pereinant per abu žemėlapius ir lyginant jų elementus.
Našumas: Prieiga, pridėjimas ir pašalinimas žemėlapyje vidutiniškai vyksta O(1) laiko. Blogiausiu atveju (pavyzdžiui, didelis kolizijų skaičius) jie gali užtrukti O(n) laiką.