Map — kalit va qiymat juftliklarida ma’lumot saqlaydigan to’plam, boshqa tillardagi “hash” yoki “dictionary”ning Go’dagi muqobili. Har bir kalit noyob bo’ladi va qiymatga to’g’ridan-to’g’ri, tez murojaat imkonini beradi.
map[KalitTuri]QiymatTuri — kalit va qiymat turlari aniq ko’rsatiladigan, o’zgaruvchan to’plam turi. Map — reference turi: slice kabi, o’zlashtirilganda nusxalanmaydi.
Map yaratish va qiymatga murojaat
Map literal orqali yoki make bilan yaratiladi:
package main
import "fmt"
func main() {
narxlar := map[string]int{
"non": 4000,
"sut": 12000,
}
fmt.Println(narxlar["non"])
narxlar["tuxum"] = 25000
fmt.Println(narxlar["tuxum"])
}
4000
25000
map[string]int{...} — kalitlari string, qiymatlari int bo’lgan map. Yangi kalit-qiymat qo’shish oddiy o’zlashtirish orqali (narxlar["tuxum"] = 25000) amalga oshadi — kalit oldindan e’lon qilinishi shart emas.
comma-ok naqshi — kalit mavjudligini tekshirish
Mavjud bo’lmagan kalitga murojaat qilinganda Go xato bermaydi — qiymat turining zero value’sini qaytaradi. Kalit chindan mavjudligini bilish uchun ikkinchi qaytariladigan qiymat ishlatiladi:
package main
import "fmt"
func main() {
narxlar := map[string]int{"non": 4000, "sut": 12000}
qiymat, mavjud := narxlar["non"]
fmt.Println(qiymat, mavjud)
qiymat2, mavjud2 := narxlar["tuxum"]
fmt.Println(qiymat2, mavjud2)
}
4000 true
0 false
"tuxum" map’da yo’q, shuning uchun qiymat2 — intning zero value’si (0), mavjud2 esa false. Bu — Go’da “comma-ok” naqshi deb ataladi va kalit bor-yo’qligini ishonchli tekshirishning yagona to’g’ri yo’li (faqat narxlar["tuxum"]ga qarab, u 0 chunki yo’qligidanmi yoki chindan 0 qiymat saqlanganidanmi — ajratib bo’lmaydi).
Elementni o’chirish
Kalit-qiymat juftligini olib tashlash uchun o’rnatilgan delete funksiyasi ishlatiladi:
package main
import "fmt"
func main() {
narxlar := map[string]int{"non": 4000, "sut": 12000}
delete(narxlar, "non")
fmt.Println(narxlar)
fmt.Println(len(narxlar))
}
map[sut:12000]
1
delete(narxlar, "non") — mavjud bo’lmagan kalit uchun chaqirilsa ham xato bermaydi, shunchaki hech narsa qilmaydi.
Aylanib chiqish tartibi — kafolatlanmagan
Go’ning muhim, ataylab qilingan qarori: for...range bilan map bo’ylab yurilganda tartib har safar boshqacha bo’lishi mumkin. Tartibli natija kerak bo’lsa, kalitlarni alohida yig’ib, saralash kerak:
package main
import (
"fmt"
"sort"
)
func main() {
narxlar := map[string]int{"sut": 12000, "non": 4000, "tuxum": 25000}
kalitlar := make([]string, 0, len(narxlar))
for kalit := range narxlar {
kalitlar = append(kalitlar, kalit)
}
sort.Strings(kalitlar)
for _, kalit := range kalitlar {
fmt.Printf("%s: %d\n", kalit, narxlar[kalit])
}
}
non: 4000
sut: 12000
tuxum: 25000
Avval barcha kalitlar alohida slice’ga yig’ildi, sort.Strings ular ustida alifbo tartibida saraladi, so’ng shu tartibda map’ga murojaat qilindi. Bu — Go’da tartibli chiqish kerak bo’lganda qo’llaniladigan standart naqsh.