Darsliklar Go Lang Map

Go Lang Go Lang Map

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]QiymatTurikalit 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 qiymat2intning 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.