Middle
Kaip veikia Map Go?
sobes.tech AI
Atsakymas iš AI
Go kalba įgyvendinta kaip žemės žemėlapis.
Pagrindiniai map struktūros komponentai:
- Hesh funkcija: Nurodo raktus į žemės reikšmes (visas skaičius).
- Dėžučių masyvas: Rinkinys sąrašų arba masyvų, kur saugomos raktų-vertės poros. Dėžutės indeksas nustatomas pagal rakto hesh reikšmę.
- Kolizijų apdorojimas: Kai skirtingų raktų hesh reikšmės sutampa (kolizija), šie elementai saugomi vienoje dėžutėje, dažniausiai kaip susietas sąrašas arba perteklius į šalia esančią dėžutę.
- Įkrovimo faktorius: Elementų skaičius ir dėžučių skaičius. Kai viršijama tam tikra riba, atliekama nauja žemės žemėlapio kūrimas ir visi elementai perkeliami iš senų dėžučių į naujas.
Go map struktūra yra atvaizduojama kaip hmap tipas:
type hmap struct {
count int // Elementų skaičius
flags uint8 // Būsenos žymės
B uint8 // log_2 dėžučių skaičius (2^B)
noverflow uint16 // Perteklių dėžučių skaičius (tik statistikai)
hash0 uint32 // Pradinis žemės žemėlapio funkcijos reikšmė
buckets unsafe.Pointer // Rodyklė į dėžučių masyvą (pagrindinį ir perteklių)
oldbuckets unsafe.Pointer // Rodyklė į seną dėžučių masyvą migracijos metu
nevacuate uintptr // Žymi, kuriame senos dėžutės pabaigoje baigėsi migracija
extra *mapextra // Papildoma informacija
}
type mapextra struct {
overflow *[2]*[]*bmap // Rodyklės į perteklių dėžučių masyvus
oldoverflow *[2]*[]*bmap // Rodyklės į senus perteklių dėžučių masyvus
nextOverflow *bmap // Sekantis laisvas perteklių dėžutė
}
type bmap struct {
tophash [8]uint8 // Viršutinis žemės žemėlapio reikšmės (hash) bitas
// Toliau eina raktai, reikšmės ir rodyklė į kitą bmap (jei dėžutė perpilama)
// Visų duomenų išdėstymas `hmap.buckets` viename malloc bloke
// Daugiau informacijos žiūrėkite ../../runtime/map.go
}