GO

GO — مپ ها (Maps)

آخرین بروزرسانی: 1404/08/14

مپ ها (Maps)

مپ (Map) یعنی مجموعه ای از «کلید (Key)» و «مقدار (Value)». مثل دفترچه تلفن که نام را به شماره وصل می کند. در Go، مپ ها در Go تغییرپذیرند و ترتیب ندارند.

تعریف کلی مپ

هر عضو مپ یک جفت key:value است. طول مپ با len() برمی گردد. مقدار پیش فرض مپ nil است.

ساخت مپ ها در Go با var و :=

می توانی با var یا := یک مپ مقداردهی شده بسازی.

package main
import (
  "fmt"
)

func main() {
  var a = map[string]string{
    "brand": "Ford",
    "model": "Mustang",
    "year":  "1964",
  }
  b := map[string]int{
    "Oslo":      1,
    "Bergen":    2,
    "Trondheim": 3,
    "Stavanger": 4,
  }

  fmt.Printf("a\t%v\n", a)
  fmt.Printf("b\t%v\n", b)
}

مشاهده در ادیتور

نکته: ترتیب چاپ با ترتیب تعریف یکی نیست؛ هش تیبل برای سرعت مهم است.

ساخت مپ با تابع make()

با make() مپ خالی می سازی و بعد کلیدها را اضافه می کنی.

package main
import (
  "fmt"
)

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  b := make(map[string]int)
  b["Oslo"] = 1
  b["Bergen"] = 2
  b["Trondheim"] = 3
  b["Stavanger"] = 4

  fmt.Printf("a\t%v\n", a)
  fmt.Printf("b\t%v\n", b)
}

مشاهده در ادیتور

مپ خالی و nil

دو راه هست: make() یا فقط اعلان. دومی nil می ماند.

package main
import (
  "fmt"
)

func main() {
  var a = make(map[string]string)
  var b map[string]string

  fmt.Println(a == nil)
  fmt.Println(b == nil)
}

مشاهده در ادیتور

هشدار: نوشتن در مپ nil خطای زمان اجرا می دهد؛ از make() استفاده کن.

نوع های مجاز کلید

کلید باید عملگر برابری == داشته باشد: بولین، عدد، رشته، آرایه، پوینتر، استراکت، اینترفیس با برابری.

نکته: اسلایس، مپ و تابع کلید معتبر نیستند.

دسترسی به عضو مپ

برای گرفتن مقدار، کلید را داخل براکت بده.

package main
import (
  "fmt"
)

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Printf(a["brand"])
}

مشاهده در ادیتور

به روزرسانی و افزودن عضو

با همان سینتکس نوشتن، مقدار را عوض کن یا کلید جدید بساز.

package main
import (
  "fmt"
)

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Println(a)

  a["year"] = "1970"
  a["color"] = "red"

  fmt.Println(a)
}

مشاهده در ادیتور

حذف عضو با delete()

برای حذف، کلید را به delete() بده.

package main
import (
  "fmt"
)

func main() {
  var a = make(map[string]string)
  a["brand"] = "Ford"
  a["model"] = "Mustang"
  a["year"] = "1964"

  fmt.Println(a)

  delete(a, "year")

  fmt.Println(a)
}

مشاهده در ادیتور

بررسی وجود کلید (val, ok)

با val, ok := m[key] وجود کلید را چک کن. اگر فقط وجود مهم است، _ جای val بگذار.

package main
import (
  "fmt"
)

func main() {
  var a = map[string]string{
    "brand": "Ford",
    "model": "Mustang",
    "year":  "1964",
    "day":   "",
  }

  val1, ok1 := a["brand"]
  val2, ok2 := a["color"]
  val3, ok3 := a["day"]
  _, ok4 := a["model"]

  fmt.Println(val1, ok1)
  fmt.Println(val2, ok2)
  fmt.Println(val3, ok3)
  fmt.Println(ok4)
}

مشاهده در ادیتور

مپ ها ارجاعی هستند

اگر دو متغیر به یک هش تیبل اشاره کنند، تغییر یکی روی دیگری اثر دارد.

package main
import (
  "fmt"
)

func main() {
  var a = map[string]string{
    "brand": "Ford",
    "model": "Mustang",
    "year":  "1964",
  }
  b := a

  fmt.Println(a)
  fmt.Println(b)

  b["year"] = "1970"
  fmt.Println("After change to b:")

  fmt.Println(a)
  fmt.Println(b)
}

مشاهده در ادیتور

پیمایش روی مپ با range

با range روی کلید و مقدار حلقه بزن. ترتیب تضمین نمی شود.

package main
import (
  "fmt"
)

func main() {
  a := map[string]int{
    "one":   1,
    "two":   2,
    "three": 3,
    "four":  4,
  }

  for k, v := range a {
    fmt.Printf("%v : %v, ", k, v)
  }
}

مشاهده در ادیتور

پیمایش مرتب با ساختار کمکی

چون مپ نامرتب است، یک لیست از ترتیب بساز و طبق آن چاپ کن. این روش برای تأکید بر مپ ها در Go کاربردی است.

package main
import (
  "fmt"
)

func main() {
  a := map[string]int{
    "one":   1,
    "two":   2,
    "three": 3,
    "four":  4,
  }

  var order []string
  order = append(order, "one", "two", "three", "four")

  for k, v := range a {
    fmt.Printf("%v : %v, ", k, v)
  }

  fmt.Println()

  for _, key := range order {
    fmt.Printf("%v : %v, ", key, a[key])
  }
}

مشاهده در ادیتور

جمع بندی سریع

  • مپ ها جفت کلید/مقدار نگه می دارند.
  • برای ساخت، از make() استفاده کن.
  • val, ok وجود کلید را مشخص می کند.
  • مپ ها ارجاعی هستند و ترتیب ندارند.

مطالب مرتبط: استراکت (Struct)، پارامترها/آرگومان ها.