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.
import "maps"
[!NOTE] Eslatma: Goda
maplarning tartibi kafolatlanmagan — ya'ni har safarfor rangebilan aylanganda kalitlar boshqa-boshqa tartibda chiqishi mumkin. Shu sababli quyidagi misollarda natijani izchil ko'rsatish uchun kalitlar/qiymatlar avvalslices.Sort()bilan saralab olinadi.
Keys()maps.Keys() — bevosita slays emas, balki iterator (iter.Seq) qaytaradi. Uni oddiy slaysga aylantirish uchun slices.Collect() bilan birga ishlatiladi:
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:
[anor olma uzum]
Values()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:
[3 5 10]
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:
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:
5 100
m o'zgarmadi, chunki m2 — mustaqil nusxa. Agar m2 := m deb yozganimizda, m["olma"] ham 100 ga aylanardi.
Equal()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:
true
Copy()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:
3
[!IMPORTANT]
maps.Copy(dst, src)—srcdagi kalitlarnidstga qo'shadi (agar shu kalitdstda avvaldan bo'lsa, uning qiymati yangilanadi). Budstni butunlay tozalab,srcbilan almashtirmaydi — mavjud kalitlar (masalan, yuqoridagi misolda"x") saqlanib qoladi.
DeleteFunc()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:
map[olma:5 uzum:10]
"anor": 3 o'chirildi, chunki uning qiymati (3) berilgan shartga (v < 5) mos keldi.
| Vazifa | Funksiya |
|---|---|
| Barcha kalitlarni olish | slices.Collect(maps.Keys(m)) |
| Barcha qiymatlarni olish | slices.Collect(maps.Values(m)) |
| Mustaqil nusxa olish | maps.Clone(m) |
| Ikkita map'ni solishtirish | maps.Equal(a, b) |
| Bir map'dan boshqasiga nusxalash | maps.Copy(dst, src) |
| Shartga mos elementlarni o'chirish | maps.DeleteFunc(m, func...) |