در Go، map یک نوع دادهی توکار است که کلیدها را به مقدارها نگاشت میکند.
در زبانهای برنامهنویسی دیگر، ممکن است با مفهوم map به عنوان دیکشنری، جدول درهمسازی، مخزن کلید/مقدار یا آرایهی انجمنی آشنا باشید.
از نظر نحوهی نگارش، map به این شکل است:
map[KeyType]ElementType
همچنین مهم است بدانید که هر کلید یکتاست، یعنی اگر یک کلید را دو بار مقداردهی کنید، مقدار کلید متناظر بازنویسی میشود.
برای ساختن map، میتوانید این کار را انجام دهید:
// With map literal
foo := map[string]int{}
یا
// or with make function
foo := make(map[string]int)
در ادامه چند عملیات که میتوانید با map انجام دهید آورده شده است
// Add a value in a map with the `=` operator:
foo["bar"] = 42
// Here we update the element of `bar`
foo["bar"] = 73
// To retrieve a map value, you can use
baz := foo["bar"]
// To delete an item from a map, you can use
delete(foo, "bar")
اگر بخواهید مقدار یک کلید را که در map وجود ندارد بازیابی کنید، مقدار صفر نوع مقدار را برمیگرداند.
این میتواند شما را سردرگم کند، بهویژه اگر مقدار پیشفرض ElementType شما (برای مثال، ۰ برای یک int) یک مقدار معتبر باشد.
برای بررسی اینکه آیا کلیدی در map شما وجود دارد، میتوانید از این استفاده کنید:
value, exists := foo["baz"]
// If the key "baz" does not exist,
// value: 0; exists: false
یکی از دوستانتان یک فروشگاه عمدهفروشی قدیمی به اسم Gross Store دارد. این اسم از مقدار کالایی میآید که فروشگاه میفروشد: همهشان بر حسب واحد گروس هستند. دوستتان از شما خواسته است برای فروشگاهش یک سیستم نقطهی فروش (POS) پیادهسازی کنید. اول میخواهید یک نمونهی اولیه برای آن بسازید. در نمونهی اولیهتان، سیستم شما فقط مقدار را ثبت میکند. دوستتان برای کمک به شما فهرستی از واحدهای اندازهگیری در اختیارتان گذاشته است:
| واحد | مقدار |
|---|---|
| quarter_of_a_dozen | 3 |
| half_of_a_dozen | 6 |
| dozen | 12 |
| small_gross | 120 |
| gross | 144 |
| great_gross | 1728 |
برای استفاده از واحد اندازهگیری، باید آن را در برنامهتان ذخیره کنید.
units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)
باید تابعی پیادهسازی کنید که یک صورتحساب جدید (و خالی) برای مشتری میسازد.
bill := NewBill()
fmt.Println(bill)
// Output: map[]
برای پیادهسازی این مورد، باید این کارها را انجام دهید:
unit دادهشده در نگاشت units نباشد، false را برگردانید.bill مشتری اضافه کنید و سپس true را برگردانید.unit دادهشده مربوط است افزایش دهید.bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)
در نظر داشته باشید که نوع مقدار برگشتی
boolاست.
برای پیادهسازی این مورد، باید این کارها را انجام دهید:
false را برگردانید.unit دادهشده در نگاشت units نباشد، false را برگردانید.false را برگردانید.bill حذف کنید و سپس true را برگردانید.true را برگردانید.bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)
در نظر داشته باشید که نوع مقدار برگشتی
boolاست.
برای پیادهسازی این مورد، باید این کارها را انجام دهید:
item در صورتحساب نباشد، 0 و false را برگردانید.bill و true را برگردانید.bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true
در نظر داشته باشید که مقادیر برگشتی از نوع
intوboolهستند.