55 / 68

maps

maps paketi

slices singari, Go 1.21 versiyasida map turi bilan ishlashni osonlashtiruvchi maps paketi ham qo'shildi. U kalitlarni/qiymatlarni olish, nusxalash va solishtirish kabi amallarni tayyor generic funksiyalar orqali taqdim etadi.

example.go
import "maps"

[!NOTE] Eslatma: Goda maplarning tartibi kafolatlanmagan — ya'ni har safar for range bilan aylanganda kalitlar boshqa-boshqa tartibda chiqishi mumkin. Shu sababli quyidagi misollarda natijani izchil ko'rsatish uchun kalitlar/qiymatlar avval slices.Sort() bilan saralab olinadi.


1. Barcha kalitlarni olish: Keys()

maps.Keys() — bevosita slays emas, balki iterator (iter.Seq) qaytaradi. Uni oddiy slaysga aylantirish uchun slices.Collect() bilan birga ishlatiladi:

example.go
package main

import (
    "fmt"
    "maps"
    "slices"
)

func main() {
    m := map[string]int{"olma": 5, "uzum": 10, "anor": 3}

    // Keys() iterator qaytaradi, Collect() uni []string ga yig'ib beradi
    keys := slices.Collect(maps.Keys(m))
    slices.Sort(keys)

    fmt.Println(keys)
}

Natija:

kod
[anor olma uzum]

2. Barcha qiymatlarni olish: Values()

example.go
package main

import (
    "fmt"
    "maps"
    "slices"
)

func main() {
    m := map[string]int{"olma": 5, "uzum": 10, "anor": 3}

    values := slices.Collect(maps.Values(m))
    slices.Sort(values)

    fmt.Println(values)
}

Natija:

kod
[3 5 10]

3. Map'dan mustaqil nusxa olish: Clone()

Goda maplar — havola (reference) turlar. Ya'ni bitta map'ni oddiy = orqali "nusxalasangiz", aslida ikkalasi ham bitta xotira manziliga ishora qiladi va birini o'zgartirsangiz, ikkinchisi ham o'zgaradi. Haqiqiy, mustaqil nusxa olish uchun maps.Clone() ishlatiladi:

example.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    m := map[string]int{"olma": 5, "uzum": 10}

    m2 := maps.Clone(m)
    m2["olma"] = 100 // faqat m2 ni o'zgartiramiz

    fmt.Println(m["olma"], m2["olma"])
}

Natija:

kod
5 100

m o'zgarmadi, chunki m2 — mustaqil nusxa. Agar m2 := m deb yozganimizda, m["olma"] ham 100 ga aylanardi.


4. Ikkita map'ni solishtirish: Equal()

example.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    a := map[string]int{"x": 1, "y": 2}
    b := map[string]int{"x": 1, "y": 2}

    fmt.Println(maps.Equal(a, b))
}

Natija:

kod
true

5. Bir map'dan boshqasiga nusxalash: Copy()

example.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    dst := map[string]int{"x": 1}

    // manba map'dagi barcha kalit-qiymatlarni dst ga qo'shadi
    maps.Copy(dst, map[string]int{"y": 2, "z": 3})

    fmt.Println(len(dst))
}

Natija:

kod
3

[!IMPORTANT] maps.Copy(dst, src) — src dagi kalitlarni dst ga qo'shadi (agar shu kalit dstda avvaldan bo'lsa, uning qiymati yangilanadi). Bu dstni butunlay tozalab, src bilan almashtirmaydi — mavjud kalitlar (masalan, yuqoridagi misolda "x") saqlanib qoladi.


6. Shartga mos elementlarni o'chirish: DeleteFunc()

example.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    m := map[string]int{"olma": 5, "uzum": 10, "anor": 3}

    // qiymati 5 dan kichik bo'lgan barcha elementlarni o'chiramiz
    maps.DeleteFunc(m, func(k string, v int) bool {
        return v < 5
    })

    fmt.Println(m)
}

Natija:

kod
map[olma:5 uzum:10]

"anor": 3 o'chirildi, chunki uning qiymati (3) berilgan shartga (v < 5) mos keldi.


Xulosa: qachon qaysi funksiya kerak?

VazifaFunksiya
Barcha kalitlarni olishslices.Collect(maps.Keys(m))
Barcha qiymatlarni olishslices.Collect(maps.Values(m))
Mustaqil nusxa olishmaps.Clone(m)
Ikkita map'ni solishtirishmaps.Equal(a, b)
Bir map'dan boshqasiga nusxalashmaps.Copy(dst, src)
Shartga mos elementlarni o'chirishmaps.DeleteFunc(m, func...)