Go / Map (түлхүүр-утга)

Map (түлхүүр-утга)

Map бол түлхүүр-утга (key-value) хосуудыг хадгалдаг өгөгдлийн бүтэц юм. Жишээлбэл, хотуудын хүн амыг хадгалахад "Улаанбаатар → 1,500,000", "Дархан → 100,000" гэх мэтээр хадгалж болно. Түлхүүрээр хайж утгыг маш хурдан олох боломжтой.

Бусад хэлд dictionary (Python), object (JavaScript) гэж нэрлэгддэгтэй адил ойлголт юм.

Map үүсгэх

go
package main

import "fmt"

func main() {
    // Хот → Хүн ам map
    хүнАм := map[string]int{
        "Улаанбаатар": 1500000,
        "Дархан":       100000,
        "Эрдэнэт":      90000,
    }

    fmt.Println(хүнАм)
    fmt.Println("Улаанбаатарын хүн ам:", хүнАм["Улаанбаатар"])
}

Дэлгэцэнд:

код
map[Дархан:100000 Улаанбаатар:1500000 Эрдэнэт:90000]
Улаанбаатарын хүн ам: 1500000

map[string]int гэдэг нь "string түлхүүртэй, int утгатай map" гэсэн утгатай. Түлхүүр болон утгын төрөл хоёулаа дурын байж болно.

Map-ийн элементүүд хэвлэгдэх дараалал нь тогтмол биш — Go нь map-ийг санамсаргүй дарааллаар хэвлэдэг. Энэ нь хэвийн зүйл.

Элемент нэмэх, өөрчлөх, устгах

go
package main

import "fmt"

func main() {
    онооны := make(map[string]int)

    // Элемент нэмэх
    онооны["Болд"] = 95
    онооны["Анар"] = 88
    онооны["Бат"] = 72

    fmt.Println("Анарын оноо:", онооны["Анар"]) // 88

    // Утга өөрчлөх
    онооны["Бат"] = 80
    fmt.Println("Батын шинэ оноо:", онооны["Бат"]) // 80

    // Элемент устгах
    delete(онооны, "Болд")
    fmt.Println("Болд устгасны дараа:", онооны)
}

Дэлгэцэнд:

код
Анарын оноо: 88
Батын шинэ оноо: 80
Болд устгасны дараа: map[Анар:88 Бат:80]

make(map[string]int) нь хоосон map үүсгэнэ. delete(map, түлхүүр) нь тухайн түлхүүртэй элементийг устгана.

Түлхүүр байгаа эсэхийг шалгах

Map-с утга авахад тухайн түлхүүр байхгүй бол default утга (int бол 0, string бол "") буцаана. Тиймээс түлхүүр үнэхээр байгаа эсэхийг шалгах хэрэгтэй:

go
package main

import "fmt"

func main() {
    нийслэлүүд := map[string]string{
        "Монгол":  "Улаанбаатар",
        "Япон":    "Токио",
        "Солонгос": "Сөүл",
    }

    // Хоёр утга авах — утга болон "байгаа эсэх" тэмдэглэгээ
    нийслэл, байна := нийслэлүүд["Монгол"]
    if байна {
        fmt.Println("Монголын нийслэл:", нийслэл)
    }

    // Байхгүй түлхүүр шалгах
    _, байна = нийслэлүүд["Герман"]
    if !байна {
        fmt.Println("Герман map-д байхгүй")
    }
}

Дэлгэцэнд:

код
Монголын нийслэл: Улаанбаатар
Герман map-д байхгүй

утга, байна := map[түлхүүр] гэж хоёр утга авбал байна нь true эсвэл false байна. Энэ нь Go-ийн стандарт хэв маяг юм.

Map дээр давтах

range ашиглан map-ийн бүх элементийг дамжиж болно:

go
package main

import "fmt"

func main() {
    үнэнүүд := map[string]float64{
        "Алт":   150000,
        "Мөнгө": 2000,
        "Зэс":   1200,
    }

    fmt.Println("Металлын үнэ (төгрөгөөр нэг гр):")
    for металл, үнэ := range үнэнүүд {
        fmt.Printf("  %s: %.0f₮
", металл, үнэ)
    }
}

Дэлгэцэнд (дараалал өөр байж болно):

код
Металлын үнэ (төгрөгөөр нэг гр):
  Алт: 150000₮
  Мөнгө: 2000₮
  Зэс: 1200₮

for металл, үнэ := range үнэнүүд нь map-ийн бүх түлхүүр-утга хосыг нэг нэгээр авна. Slice-тай range ашигласантай адил.

Дараагийн хичээлд:

Struct буюу өөрийн дур мэдэн төрөл үүсгэхийг судална. Struct нь хүн, бараа, захиалга гэх мэт бодит амьдралын объектуудыг хэлд илэрхийлэх хамгийн нийтлэг арга юм.