مپ ها (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)، پارامترها/آرگومان ها.