۳۰ دی ۱۴۰۳
مپ ها یک نوع ساختمان داده برای ذخیره داده های key/value هستند. توی این قسمت با مپ ها آشنا میشیم و طریقه استفاده از آنها رو یاد میگیریم.
map یک نوع ساختمان داده برای ذخیره ی داده هایی هست که به صورت key/value یا کلید/مقدار هستند. در داده های key/value ما یک مقدار (value) را به یک کلید (key) نسبت میدهیم و بعدا با استفاده از کلید (key) میتونیم به مقدار آن دسترسی پیدا کنیم.
برای تعریف مپ باید از کلمه کلیدی map استفاده کنیم:
داخل کروشه [ ] نوع داده ی کلیدها و بعد از کروشه نوع داده ی مقدارها را مشخص میکنیم. در مثال بالا ما یک مپ ایجاد کردیم که کلید و مقدار ها میتوانند از نوع رشته ای (متنی) باشند.
نوع داده ی کلید ها باید مقایسه پذیر باشد. نمیتوان از نوع داده ای که با عملگر == قابل مقایسه نیست, به عنوان نوع کلید (key) استفاده کرد. برای مثال نمیتوان از نوع slice به عنوان key استفاده کرد.
در مثال بالا نوع داده ی کلیدها string و نوع داده ی مقادیر int است.
نوع داده ی map از نوع رفرنس تایپ است (شبیه اشارهگر یا slice ), بعد از تعریف یک مپ (declare) مقدار صفر آن (zero value) برابر با nil خواهد بود, در این شرایط شما میتوانید یک مقدار را از مپ بخوانید اما نمیتوانید روی map چیزی بنویسید! به مثال زیر دقت کنید:
در صورتی که مقدار یک map برابر با nil باشد، خواندن مقدار از آن باعث میشود مقدار پیشفرض (zero value) متناظر با نوع value به شما بازگردانده شود؛ در این حالت تلاش برای نوشتن بر روی map منجر به بروز خطای زمان اجرا (runtime panic) خواهد شد. بنابراین هرگز نباید قبل از تخصیص حافظه (initialize کردن map)، اقدام به نوشتن داده در آن کنید.
تا اینجا با تعریف کردن map آشنا شدیم و فهمیدیم که مقدار اولیه آن nil است. برای تخصیص حافظه به یک map دو روش وجود دارد:
مپ لیترال
استفاده از دستور make
مپ لیترال به این معنی هست که شما با استفاده از کلمه کلیدی map یک مقدار از نوع map ایجاد کنید و آن را درون متغیر خود قرار دهید.
با استفاده از make نیز میتوانید به map حافظه تخصیص بدید, بدینصورت مقدار اولیه مپ دیگر برابر با nil نخواهد بود و امکان نوشتن مقادیر روی map را خواهید داشت.
در map در صورتی که کلیدی وجود نداشته باشد مقدار صفر (zero value) متناظر با value آن برمیگردد. با استفاده از یک متغیر دوم میتوانیم صحت وجود داشتن مقدار برگردانده شده را بررسی کنیم.
همانطور که در مثال بالا دیدیم در صورتی که کلید مورد نظر ما مقداردهی شده باشد ok برابر با true خواهد بود.
برای حذف یک کلید از map میتوانیم از تابع delete استفاده کنیم. این تابع در صورتی که کلید مورد نظر ما وجود نداشته باشد کاری انجام نمیدهد. به مثال زیر دقت کنید:
برای نمایش مقادیر درون یک map میتوان از حلقه for-range نیز استفاده کرد:
در هنگامی که با استفاده از حلقه for-range بر روی map حرکت میکنیم, هربار داده ها با ترتیب متفاوتی خوانده خواهند شد. در صورتی که کد بالا را چندین بار اجرا کنید هربار ترتیب داده های نمایش داده شده در خروجی متفاوت خواهد بود.
برای اینکه بتوانیم داده ها را به ترتیب نمایش دهیم میتوانیم از slice کمک بگیریم:
در slice داده ها با توجه به ترتیب اندیس ها خوانده میشوند. بنابراین میتوانیم کلید های یک map را با ترتیب دلخواه درون یک slice قرار دهیم و سپس با حرکت کردن بر روی مقادیر درون این slice کلید های مپ را بدست اوریم و سپس مقدار متناظر هر کلید را از map بخوانیم و نمایش دهیم. در مثال بالا کلید ها را به ترتیب حروف الفبا با استفاده از تابع sorts.Strings مرتب و سپس به ترتیب نمایش میدهیم.
قسمت قبلی: حلقه ها | گولنگ به زبان ساده
قسمت بعدی: تابع (function) | گولنگ به زبان ساده