برنامه نویسی 3 بازدید

در این مطلب قصد داریم در مورد روش‌های مختلف مقایسه مقادیر در Go و همچنین مرتب‌سازی مقادیر و ترتیب‌بندی آن‌ها صحبت کنیم. اگر شما قبلاً با مفاهیم شیءگرایی آشنا باشید، می‌دانید که مقایسه وهله‌های اشیا یا از طریق نوعی overload کردن عملگر صورت می‌گیرد و یا با override کردن یک متد ()equal یا ()compareTo و الصاق به شیء برای تعریف شیوه مقایسه یک وهله با دیگری، انجام می‌یابد.

در زبان برنامه‌نویسی Go مجموعه کوچکی از انواع شناخته شده وجود دارند که حتی انواع تعریف‌شده از سوی کاربر بر مبنای آن‌ها تعریف می‌شوند. از این رو قواعد Go برای مقایسه کردن مقادیر مستقیماً در این زبان منظور شده است. به طور کلی دو مقدار تنها در صورتی می‌توانند مقایسه شوند که یک نوعشان (یا نوع تشکیل‌دهنده) یکی باشد. با این حال این قاعده کلی، ظرافت‌های زیادی دارد که در بخش بعدی بیشتر توضیح خواهیم داد.

مقایسه مقادیر در Go

برابری در زبان Go با استفاده از عملگرهای مقایسه‌ای == و =! تست می‌شود. اغلب انواع را می‌توان برای برابر بودن تست کرد، برخی از آن‌ها پشتیبانی محدودی دارند، در حالی که برخی دیگر هیچ نوع پشتیبانی ندارند. عملگرهای ترتیب‌بندی >، =>، < و =< برای تست مقادیر با انواعی که می‌توان مرتب‌سازی شوند مورد استفاده قرار می‌گیرند. در ادامه به بررسی شیوه مقایسه هر نوع در Go می‌پردازیم.

مقادیر بولی

مقادیر بولی را می‌توان با مقادیر از پیش تعریف‌شده true یا false مقایسه کرد. در صورت اقدام به مقایسه یک مقدار بولی با مقدار عددی با خطا مواجه خواهیم شد.

اعداد صحیح و اعشاری

مقایسه مقادیر عددی نیز چنان که انتظار داریم و با تبعیت از قاعده کلی پیش‌گفته در زمینه برابری و ترتیب‌بندی انجام می‌یابد.

با این حال به دلیل محدودیت‌های نوع‌بندی صریح در Go اعداد صحیح را تنها با اعداد صحیح و اعداد اعشاری را نیز تنها با اعداد اعشاری می‌توان مقایسه کرد. اگر تلاش کنید مقادیر اعشاری را با اعداد صحیح یا برعکس مقایسه کنید، سیستم نوع‌بندی نیازمند یک تبدیل خواهد بود یا ریسک شکست در زمان کامپایل پدید می‌آید.

در مثال قبلی، این کد تنها در صورتی کار می‌کرد که هر دو متغیر با نوع یکسانی اعلان شده باشند، یا به نوع یکسانی تبدیل می‌شدند.

اعداد مختلط

اعداد مختلط نیز می‌توانند برای برابری تست شوند. دو عدد مختلط تنها در صورتی برابر هستند که بخش‌های حقیقی و موهومی آن‌ها به ترتیب با هم برابر باشند.

اما به دلیل ماهیت اعداد مختلط، امکان پشتیبانی از عملیات ترتب بندی آن‌ها در زبان Go وجود ندارد.

مقادیر رشته‌ای

مقادیر رشته‌ای از هر دو عملگر استاندارد برابری و ترتیب‌بندی پشتیبانی می‌کنند. هیچ تابع اضافی برای مقایسه رشته‌ها لازم نیست. مقادیر رشته‌ای را می‌توان به صورت خودکار به صورت الفبایی با استفاده از ==، =!، <، >، و >= مقایسه کرد.

مقادیر struct

دو مقدار struct را می‌توان برای برابر بودن با استفاده از مقایسه مقدار فیلدهای متناظر مورد تست قرار داد. به طور کلی دو مقدار struct تنها در صورتی برابر هستند که نوع یکسانی داشته باشند و فیلدهای متناظرشان برابر باشند.

در قطعه کد فوق struct به نام p1 با p2 برابر است، چون هر دو از یک نوع هستند و مقادیر فیلد متناظرشان نیز یکسان است. هر تغییری در مقادیر فیلد موجب می‌شود که struct-ها برابر نباشند.

با این حال، مقادیر struct نمی‌توانند با استفاده از عملگرهای ترتیب‌بندی مقایسه شوند. از این رو کد زیر کامپایل نخواهد شد.

آرایه‌ها

مقادیر آرایه‌ای با مقایسه عناصر با انواع تعریف‌شده برای برابری تست می‌شوند. آرایه‌ها تنها در صورتی برابر هستند که مقادیر متناظرشان برابر باشند.

همانند مقادیر struct آرایه‌ها نمی‌توانند با استفاده از عملگرهای ترتیب‌بندی <، <=، > و >= مقایسه شوند. هر تلاشی در این جهت موجب بروز خطای کامپایل خواهد شد.

اشاره‌گرها

مقادیر اشاره‌گر می‌توانند برای برابری مقایسه شوند، اما این امکان برای ترتیب‌بندی وجود ندارد. دو مقدار اشاره‌گر تنها در صورتی برابر تصور می‌شوند که به مقدار یکسانی در حافظه اشاره کنند (و یا تهی باشند). برای نمونه در قطعه کد زیر ‎&pair با ptr2 برابر است، اما ‎&pair با ptr برابر نیست.

به خاطر داشته باشید که یک اشاره‌گر به یک نوع در واقع همان خود نوع نیست. از این رو تلاش برای مقایسه این دو یک خطای عدم تطبیق کامپایل ایجاد خواهد کرد.

اینترفیس‌ها

مقادیر اینترفیس از این جهت جالب هستند که می‌توانند با موارد زیر مقایسه شوند:

  • با اینترفیس‌های دیگر
  • با مقادیری که نوعشان، اینترفیس را پیاده‌سازی می‌کند

دو مقدار اینترفیس تنها در صورتی برابر تصور می‌شوند که نوع‌های تشکیل‌دهنده آن‌ها و مقادیرشان مقایسه پذیر و برابر باشند و یا این که هر دو اینترفیس تهی باشند.

برای نمونه در قطعه کد زیر، مقادیر اینترفیس r0 و r2 برابر هستند، زیرا نوع تشکیل‌دهنده یکسانی را با مقادیر یکسان rectangle{l:3, w:6} پیاده‌سازی می‌کنند. از سوی دیگر اگر چه مقادیر اینترفیس r0 و r1 نوع اینترفیس یکسانی را پیاده‌سازی کرده‌اند، اما می‌توان مشاهده کرد که برابر نیستند، زیرا مقادیرشان به صورت rectangle{3, 6} و rectangle{6, 3} بوده و متفاوت است. به طور مشابه متغیرهای اینترفیس r1 و s0 برابر نیستند، زیرا مقادیر دینامیک متفاوتی دارند، گرچه اینترفیس یکسانی را پیاده‌سازی می‌کنند.

لازم به اشاره است که اگر انواع تشکیل‌دهنده و مقادیر اینترفیس مقایسه پذیر نباشند، هر تلاشی برای مقایسه کردن آن‌ها موجب بروز مشکلاتی در زمان اجرا می‌شود.

کانال‌ها

مقادیر کانال را تنها می‌توان در مورد برابری مقایسه کرد. دو مقدار کانال تنها در صورتی برابر تصور می‌شوند که از فراخوانی make یکسانی نشأت گرفته باشند، یعنی به مقدار کانال یکسانی در حافظه اشاره کنند.

برای نمونه در مثال زیر ch0 با ch1 برابر نیستند هر چند نوع یکسانی دارد. اما ch1 با ch2 برابر هستند زیرا هر دو آن‌ها به مقدار کانال یکسانی اشاره دارند.

سخن پایانی

در این مقاله تلاش کردیم شما را با روش‌های مختلف مقایسه مقادیر در Go آشنا کنیم. زبان برنامه‌نویسی Go مجموعه کوچکی از قواعد شناخته شده برای مقایسه و ترتیب‌بندی مقادیر دارد. چنان که دیدیم با این که مقایسه مقادیر از هر نوع با استفاده از عملگر == و =! میسر است، اما تنها انواع معدودی هستند که می‌توان با استفاده از عملگرهای ترتیب‌بندی مانند <، >، <=, >= مقایسه کرد.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

telegram
twitter

میثم لطفی

«میثم لطفی» دانش‌آموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری همه علاقه‌مندی‌های خود در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و تولید محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *