Middle
Kuidas töötab Map Go-s?
sobes.tech AI
Vastus AI-lt
Go-s kaart on rakendatud kui hajus tabel.
map struktuuri põhikomponendid:
- Hash-funktsioon: Määrab võtmed hash-väärtustele (täisarvud).
- Kastide massiiv: Komplekt nimekirjadest või massiividest, kus hoitakse võti-väärtus paare. Kasti indeks määratakse võtme hash-väärtuse järgi.
- Kollisioonide töötlemine: Kui erinevate võtmete hashid kattuvad (kollisioon), salvestatakse need elemendid ühte kasti, tavaliselt seotud nimekirja või ülevoo vormis naabruses.
- Laadimistegur: Elementide arv ja kastide arv. Kui see ületab teatud piiri, toimub uus hajutustabeli loomine ning kõik elemendid liigitatakse vanadest kastidest uutesse.
Go-s on map struktuur esitatud tüübi hmap kaudu:
type hmap struct {
count int // Elementide arv
flags uint8 // Seisundi lipud
B uint8 // log_2 kastide arv (2^B)
noverflow uint16 // Ülevoogude kastide arv (ainult statistika jaoks)
hash0 uint32 // Algväärtus hash-funktsioonile
buckets unsafe.Pointer // Näitaja kastide massiivile (peamine ja ülevood)
oldbuckets unsafe.Pointer // Näitaja vanale kastide massiivile migratsiooni ajal
nevacuate uintptr // Märgib, millisesse vana kastisse migratsioon on lõpetatud
extra *mapextra // Täiendav teave
}
type mapextra struct {
overflow *[2]*[]*bmap // Näitaja ülevoogude kastide massiividele
oldoverflow *[2]*[]*bmap // Näitaja vanade ülevoogude kastide massiividele
nextOverflow *bmap // Järgmine vaba ülevoogude kast
}
type bmap struct {
tophash [8]uint8 // Ülahašš (ülemised bitid) kiirendamiseks otsingus kastis
// Järgnevad võtmed, väärtused ja näitaja järgmisele bmap-ile (kui kast on ülevoog)
// Kõigi andmete paigutus `hmap.buckets` ühes malloc plokis
// Vaadake ../../runtime/map.go detailide jaoks
}