Go با مثال: مپ‌ها

مپ‌ها (maps) نوع داده‌ی انجمنی داخلی Go هستند (که در زبان‌های دیگر گاهی hash یا dict نامیده می‌شوند).

package main
import (
    "fmt"
    "maps"
)
func main() {

برای ساختن یک مپ خالی از تابع داخلی make استفاده کنید: make(map[key-type]val-type).

    m := make(map[string]int)

جفت‌های کلید/مقدار را با نحو معمول name[key] = val تنظیم کنید.

    m["k1"] = 7
    m["k2"] = 13

چاپ یک مپ، مثلاً با fmt.Println، همهٔ جفت‌های کلید/مقدار آن را نشان می‌دهد.

    fmt.Println("map:", m)

مقدار یک کلید را با name[key] بخوانید.

    v1 := m["k1"]
    fmt.Println("v1:", v1)

اگر کلید وجود نداشته باشد، مقدار صفر نوعِ مقدار برگردانده می‌شود.

    v3 := m["k3"]
    fmt.Println("v3:", v3)

تابع داخلی len وقتی روی مپ صدا زده شود، تعداد جفت‌های کلید/مقدار را برمی‌گرداند.

    fmt.Println("len:", len(m))

تابع داخلی delete جفت‌های کلید/مقدار را از مپ حذف می‌کند.

    delete(m, "k2")
    fmt.Println("map:", m)

برای حذف همهٔ جفت‌های کلید/مقدار از یک مپ، از تابع داخلی clear استفاده کنید.

    clear(m)
    fmt.Println("map:", m)

مقدار بازگشتی دوم (اختیاری) هنگام خواندن از مپ نشان می‌دهد که آیا کلید در مپ وجود داشته یا نه. با این کار می‌توان کلیدهای ناموجود را از کلیدهایی که مقدار صفر دارند (مثل 0 یا "") تشخیص داد. اینجا به خود مقدار نیازی نداشتیم، پس آن را با شناسهٔ خالی _ نادیده گرفتیم.

    _, prs := m["k2"]
    fmt.Println("prs:", prs)

با این نحو می‌توانید یک مپ جدید را در همان خط تعریف و مقداردهی هم بکنید.

    n := map[string]int{"foo": 1, "bar": 2}
    fmt.Println("map:", n)

بستهٔ maps تعدادی تابع کمکی مفید برای مپ‌ها دارد.

    n2 := map[string]int{"foo": 1, "bar": 2}
    if maps.Equal(n, n2) {
        fmt.Println("n == n2")
    }
}

توجه کنید که مپ‌ها هنگام چاپ با fmt.Println به شکل map[k:v k:v] نمایش داده می‌شوند.

$ go run maps.go 
map: map[k1:7 k2:13]
v1: 7
v3: 0
len: 2
map: map[k1:7]
map: map[]
prs: false
map: map[bar:2 foo:1]
n == n2

مثال بعدی: .