روش های مختلف برای مقایسه مقادیر در Go — به زبان ساده



تعداد بازدید ها:
0

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

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

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

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

مقادیر بولی

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


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

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


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


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


اعداد مختلط

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


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


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

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


مقادیر strcut

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


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

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


آرایه‌ها

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


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

اشاره‌گرها

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


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

اینترفیس‌ها

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

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

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

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


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

کانال‌ها

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

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


سخن پایانی

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

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

==

به عنوان حامی، استارتاپ، محصول و خدمات خود را در انتهای مطالب مرتبط مجله فرادرس معرفی کنید.

telegram
twitter