Sobes.tech
Middle

Ինչպես է աշխատում Map-ը Go-ում?

sobes.tech AI

Պատասխան AI-ից

Map-ը Go-ում իրականացվում է որպես հեշ-տախտակ:

Հիմնական բաղադրիչները map կառուցվածքի:

  • Հեշ-գործառույթ: Կառուցում է բանալիները հեշ արժեքների (լուծարանական թվեր):
  • Բաքետների զանգված: Կազմված է ցանկերի կամ զանգվածների, որտեղ պահվում են բանալիներ-արժեք զույգերը: Բաքետի ինդեքսը որոշվում է բանալու հեշ արժեքով:
  • Կոլիզիաների մշակումը: Երբ տարբեր բանալիների համար հեշերը համընկնում են (կոլիզիա), այդ տարրերը պահվում են մեկ բաքետում, սովորաբար կապված ցանկի կամ լրացուցիչ բաքի միջոցով:
  • Բեռնվածության գործակից: Բանալի տարրերի և բաքետների քանակի հարաբերակցություն: Երբ այն գերազանցում է որոշ սահման, կատարվում է վերահեշավորում՝ նոր, մեծ զանգվածի ստեղծում և տարրերի տեղափոխում հին բաքետներից նորերը:

map կառուցվածքը Go-ում ներկայացված է hmap տիպով:

type hmap struct {
    count     int // տարրերի քանակը
    flags     uint8 // վիճակի նշաններ
    B         uint8 // log_2 բաքետների քանակի (2^B)
    noverflow uint16 // լրացուցիչ բաքետների քանակը (միայն վիճակագրության համար)
    hash0     uint32 // սկզբնական հեշ արժեքը

    buckets    unsafe.Pointer // ցուցիչ բաքետների զանգվածին
    oldbuckets unsafe.Pointer // ցուցիչ հին բաքետների զանգվածին միգրացիայի ժամանակ
    nevacuate  uintptr // նշում է, թե որ հին բաքետում ավարտվել է միգրացիան

    extra *mapextra // լրացուցիչ տեղեկություններ
}

type mapextra struct {
    overflow    *[2]*[]*bmap // ցուցիչներ լրացուցիչ բաքետների զանգվածների
    oldoverflow *[2]*[]*bmap // ցուցիչներ հին լրացուցիչ բաքետների
    nextOverflow *bmap // հաջորդ ազատ լրացուցիչ բաքը
}

type bmap struct {
    tophash [8]uint8 // վերին հեշ (վերևի բիթերը) արագացման համար
    // Նշաններ, արժեքներ և ցուցիչ հաջորդ bmap-ի համար (եթե բաքը լրացուցիչ է)
    // բոլոր տվյալների դասավորությունը hmap.buckets-ում մեկ malloc բլոկում
    // մանրամասների համար տես ../../runtime/map.go
}