بررسی سه مسئله رایج برنامه نویسی در زبان Go | راهنمای پیشرفته


هر زبان برنامهنویسی خصوصیات منحصر به فردی دارد. ما در این مقاله به بررسی سه مسئله رایج برنامه نویسی در زبان Go میپردازیم. پاسخ این مسائل در زبان جاوا ممکن است کاملاً متفاوت باشد. میتوان گفت که پاسخ این مسائل در زبان جاوا سرراستتر است، اما برای حل آنها در Go به کمی کار بیشتری نیاز داریم.
Golang روشهای منحصر به فردی برای حل این مسائل دارد. شاید راهحلهایی که در این مقاله ارائه میشوند، در ابتدای امر به نظر شما چندان سرراست نباشند، اما با کمی تأمل و اندیشه با آنها بیشتر آشنا میشوید. همچنین باید اشاره کنیم که حتماً محتمل است که روشهای بهتری برای حل این مسائل در Go وجود داشته باشد.
اینک نوبت آن رسیده است که مسائل مورد اشاره را بررسی و حل کنیم.
مسئله رایج اول در زبان برنامه نویسی Go
باید یک مجموعه از آیتمها را نگهداری کنیم. اما میدانیم که Go ساختمان دادهای به نام مجموعه (Set) ندارد. یک راهحل محتمل این است که به جای Set از Map استفاده کنیم. مجموعه کلیدهای یک Map در Go شامل مجموعه یکتایی از آیتمها است.
به این منظور میتوانید به صورت زیر عمل کنید:
مزیت استفاده از Map به عنوان یک ساختمان داده بنیادی برای مجموعه این است که همچنان از جستجوی فوق سریع کلیدهای نگاشت و بهینهسازی بنیادی هش کردن بهرهمند هستیم و در نهایت به نوشتن کد کمتری نیاز داریم.
مسئله رایج دوم در زبان برنامه نویسی Go
فرض کنید میخواهیم دو مقدار را با هم مقایسه کنیم، اما میدانیم که استفاده از عملگر == همیشه ممکن نیست. برای یافتن راهحل این مسئله باید با طرز کار == و جاهایی که میتوان از آن استفاده کرد یا نکرد آشنا شویم. ابتدا یک struct شامل map یا sclice تعریف میکنیم.
در ادامه Struct را با اشارهگرها تعریف میکنیم. میدانیم که اشارهگرها را میتوان با هم مقایسه کرد، اما همیشه نتیجه مطلوب به دست نمیدهد.
استفاده از reflect.DeepEqual
اکنون کد ما تا حدود زیادی مطابق انتظار کار میکند:
این کد نتایج بهتری ارائه میکند، اما اگر از اعداد اعشاری یا مقادیر زمانی در struct استفاده کرده باشید، باید آنها را نادیده بگیرید. در این موارد باید یک متد equals سفارشی بنویسید.
شما نیاز به نوشتن تابعهای سفارشی equals ندارید، مگر این که چاره دیگری نباشد، اما شاید بپرسید آیا استفاده از reflect.DeepEqual ترجیحی بر عملگر == دارد؟ پاسخ این است که اساساً reflect.DeepEqual زمانی مقدار True میدهد که عملگر == این مقدار را بدهد. بنابراین به صورت پیشفرض میتوان از reflect.DeepEqual استفاده کرد، مگر این که مشکلات عملکردی داشته باشید:
چنان که میبینید عملگر == بسیار سریعتر از reflect.DeepEqual است.
مسئله رایج سوم در زبان برنامه نویسی Go
فرض کنید لازم است از یک struct به عنوان کلید یک Map استفاده کنید، اما این struct دارای Slice، اشارهگر یا فیلدهای است که باید نادیده بگیرید. یک راهحل این مسئله استفاده از ارزیابی کلید Map است. اما این ارزیابی در Go با استفاده از عملگر == و نه reflect.DeepEqual اجرا میشود.
یک روش برای حل این مشکل، استفاده از یک منطق سفارشی برای ایجاد کلید است.
مسئله نهایی
مسئله چهارمی که در این مقاله بررسی میکنیم، روش مقایسه دو Map در Go است:
نخستین نکتهای که باید توجه داشته باشیم این است که امکان مقایسه دو Map با استفاده از عملگر == وجود ندارد. همچنین شما نمیتوانید دو Map را با استفاده از reflect.DeepEqual مقایسه کنید. بر اساس قواعد reflect.DeepEqual، به ترتیب کلیدهای Map با عملگر = مقایسه میشوند و برای مقایسه مقادیر نیز از reflect.DeepEqual استفاده میشود.
به این ترتیب به پایان این مقاله میرسیم. امیدواریم این مطلب با موضوع بررسی سه مسئله رایج برنامهنویسی در زبان Go مورد توجه شما قرار گرفته باشد.