طرح‌چه

نوع داده map | گولنگ به زبان ساده

2 ماه پیش

نوع داده map | گولنگ به زبان ساده
مپ ها یک نوع ساختمان داده برای ذخیره داده های key/value هستند. توی این قسمت با مپ ها آشنا میشیم و طریقه استفاده از آنها رو یاد میگیریم.

map یک نوع ساختمان داده برای ذخیره ی داده هایی هست که به صورت key/value یا کلید مقدار هستند. در داده های key/value ما یک مقدار (value) را به یک کلید (key)  نسبت میدهیم و بعدا با استفاده از کلید (key) میتونیم به مقدار آن دسترسی پیدا کنیم.

برای تعریف مپ میتونیم از کلمه کلیدی map استفاده کنیم

var ftruits map[string]string

داخل کروشه [ ] نوع داده ی کلیدها و بعد از کروشه نوع داده ی مقدارها را مشخص میکنیم. در مثال بالا ما یک مپ ایجاد کردیم که کلید و مقدار ها میتوانند از نوع رشته ای (متنی) باشند.

نوع داده ی کلید ها باید مقایسه پذیر باشد. نمیتوان از نوع داده ای که با عملگر == قابل مقایسه نیست, به عنوان نوع داده ی کلید (key) استفاده کنید. برای نمیتوان از نوع slice به عنوان key استفاده کرد.

بعد از تعریف یک مپ (declare) مقدار صفر آن (zero value) برابر با nil خواهد بود. شما میتوانید یک مقدار را از مپ بخوانید اما نمیتوانید روی map چیزی بنویسید! به مثال زیر دقت کنید:

package main

import "fmt"

func main() {
	var countryCodes map[string]int
	
	fmt.Println(countryCodes)
	fmt.Println(countryCodes == nil)
	fmt.Println(countryCodes["germany"])
	fmt.Println(countryCodes["iran"])
}

// output:
// map[]
// true
// 0
// 0

اگر سعی کنید بعد از تعریف (declare) یک مپ دیتایی رو از آن بخوانید, مقدار صفر (zero value) مرتبط با value به شما برگشت داده می شود. اما اگر بخواهید روی map بنویسید با خطا (panic) مواجه خواهید شد. 

تا اینجا با تعریف کردن map آشنا شدیم و فهمیدیم که مقدار اولیه آن nil است. اما برای تخصیص حافظه به یک map دو روش وجود دارد:

  1. مپ لیترال

  2. استفاده از make

package main

func main(){
	// 1. using map literal
	countryCodes_1 := map[string]int{"iran": 98, "germany": 49}
	
	fmt.Println(countryCodes_1)

	// 2. using make to allocate memory for map
	countryCodes_2 := make(map[string]int)
	countryCodes_2["iran"] = 98
	countryCodes_2["germany"] = 49
	
	fmt.Println(countryCodes_2)
}

// output:
// map[germany:49 iran:98]
// map[germany:49 iran:98]

مپ لیترال به این معنی هست که شما با استفاده از کلمه کلیدی map یک مقدار از نوع map ایجاد کنید و آن را درون متغیر خود قرار دهید.

با استفاده از make نیز میتوانید به map حافظه تخصیص بدید, بدینصورت مقدار اولیه مپ دیگر برابر با nil نخواهد بود و امکان نوشتن مقادیر روی map را خواهید داشت.

بررسی و حذف کلیدها

در map در صورتی که کلیدی وجود نداشته باشد مقدار صفر (zero value) متناظر با value آن برمیگردد. با استفاده از یک متغیر دوم میتوانیم صحت وجود داشتن مقدار برگردانده شده را بررسی کنیم.

package main

import "fmt"

func main() {
	var countryCodes_2 map[string]int

	countryCodes_2 = make(map[string]int)
	countryCodes_2["iran"] = 98
	countryCodes_2["germany"] = 49

	iranCode, ok := countryCodes_2["iran"]
	fmt.Println(iranCode, ok)

	franceCode, ok := countryCodes_2["france"]
	fmt.Println(franceCode, ok)
}

// output:
// 98 true
// 0 false

همانطور که در مثال بالا دیدیم در صورتی که کلید مورد نظر ما مقداردهی شده باشد ok برابر با true خواهد بود.

برای حذف یک کلید از map میتوانیم از تابع delete استفاده کنیم, به مثال زیر دقت کنید:

package main

import "fmt"

func main() {
	var countryCodes_2 map[string]int

	countryCodes_2 = make(map[string]int)
	countryCodes_2["iran"] = 98
	countryCodes_2["germany"] = 49

	code, ok := countryCodes_2["germany"]
	fmt.Println(code, ok)

	delete(countryCodes_2, "germany")

	code, ok = countryCodes_2["germany"]
	fmt.Println(code, ok)
}

// output:
// 49 true
// 0 false

برای نمایش مقادیر درون یک map میتونید از حلقه for-range نیز استفاده کنید:

package main

import "fmt"

func main() {
	var countryCodes map[string]int

	countryCodes = make(map[string]int)
	countryCodes["iran"] = 98
	countryCodes["germany"] = 49

	for key, value := range countryCodes {
		fmt.Println(key, value)
	}
}

// output:
// iran 98
// germany 49

قسمت قبلی: حلقه ها |‌ گولنگ به زبان ساده

قسمت بعدی: تابع (function) | گولنگ به زبان ساده


دیدگاه ها