Generics in Golang

سلام دوستان امیدوارم در این روزهای سخت حالتون خوب باشه وقوی باشید #mahsa_aminiمتنی که اینجا می بینید برداشتی خواهد بود از سورس اصلی وب سایت Go که اگه روی این بخش کلیک کنید() خواهید دید.برای اینکه اگر کسی به زبان تسلط کافی نداره زیاد محروم نباشه تا زمانی که زبانو یاد می گیره چون راهی جز این نیست#برای_آیندهاین آموزش به مبانی Generics در زبان Go می پردازه.با این مفهوم می تونی function ها و type هایی رو تعریف و استفاده کنی که به منظور کنار اومدن با هر نوع از داده نوشته شدن (میدونیم که برای تعریف هر نوع از متغیر باید type خاصی که در ظرف متغیر مدنظر ما قرار خواهد گرفت رو مشخص کنیم مثلا : type x string میگه متغیر x ظرفی هست که تنها و تنها مقادیری از رشته ها رو در خودش نگهداری میکنه . مفهوم Generics به معنای عمومی ها مارو از این محدودیت میخواد در بیاره) اینجا ما قراره به دوشکل یک عمل رو انجام بدیم یکی به وسیله ی non-Generic function ها که طبیعتا ما ازشون استفاده میکنیم و بعد همون عمل رو به Generic Function ها بسپاریم ببینیم چی میشه !مراحل کار اینان :۱- یه folder برای کدت می سازی۲- یه سری non-Generic function اضافه میکنی۳- یه generic Function برای هندل کردن چند تایپ (multiple types) تعریف میکنی۴- وقتی generic function رو وسط میاری دیگه نوع داده ها رو از بین انواع مجازش خودش تشخیص میدهخب اول یه سمپل hello world که دستت گرم بشه بزن :شوخی کردم جدی نگیر <span style='font-size:100px;'>&#128530;</span>امیدوارم مرحله ی اول رو که پیش نیازهای نوشتن این کدها باشه بتونید انجام بدید (اگه نمی تونید پیشنهاد میکنم فعلا این قلمو فراموش کنید بر گردید راه اندازی رو کار کنید // یعنی ساخت یه فولدر :| یه ماژول go و یه function main - تمام این مراحل رو منبعی که بالا قرار دادم و این متن تقریبا ترجمه ی اونه براتون شرح داده)خب زیر تعریف نام پکیج این فانکشن non-Generic رو اضافه می کنیم(منظور همون تابع های عادی هست که همیشه استفاده کردیم . این یک نمونه ش هست)یه trace انجام بدید ببینید منظور این دو function رو متوجه میشید یانه function اول یه map که string رو به int64 قراره map کنه به عنوان ورودی گرفته و int64 ها رو هم به عنوان مقادیری که کلیدش string بوده جمع میزنه و به ما قراره برگردونه function بعدی همونه فقط ورودی تابع یه map هست که بجای int64 داره float64 بر میگردونهقصه رو گرفتید ؟ بحث ما راجع به type هاست . ورودی ها و خروجی های این دو فقط type های مختلف دارن اگرنه اعمال یکسانی رو دارن انجام میدن : یه map بگیر و مقادیر map جمع کن و بر گردونحالا بیا تو تابع main مطابق تصویر بالا دوتا map بساز و مقدار دهی کن و به توابعی که بالاتر ساختیم pass بده که نتایج رو ببینی : دیدید ؟ برای اینکه روی map ها با key-value های مختلف الانواع (multiple types) و البته خروجی های از type های مختلف محاسباتی رو انجام بدیم non-generic function های زیادی باید مصرف بشه و این یعنی کد بیشتر احتمال خطای بیشتر صرف زمان و خستگی بیشتر حجم بالاتر maintenance دشوار تر و پر هزینه تر و پیچیدگی بیشتر و...حال چه کنیم ای وی ؟کار کردن با generic function ها را فراگیر و کار بند که صرفه در هزاین خویش بجویی :)برای اینکه بتونیم مقادیر از انواع int64 , float64 رو در ورودی یکسان به یک تابع Generic بدیم در مثال بالا اینکارو میکنیم: قبل از آرگومان های ورودی تابع . درست پس از نام تابع در یک براکت باز و بسته مقادیر رو برای عمل function تعریف میکنیم :func SunIntsOrFloats[K compairable, V int64 | float64](m map[K]V) Vیه توضیحی بدم : همونطور که میدونیم کلید مورد استفاده در هر دو map ی که استفاده کرده بودیم از نوع string بود درسته ؟پس این مقداریه که قراره مقایسه بشه با مقادیر متناظرش . اینو میذاریم compairable چیزی که نوعش متفاوت بودvalue ما بود که متغیرش رو میذاریم V و با یه علامت خط عمودی که معنای OR میده بهش تمام available option هاش رو میدیم که میشه دو نوع int64 و float64 و به حکم or هرکدوم بیاد میگیره حالا بریم که این فانکشن رو استفاده کنیم جای قبلی :و خروجی : هنوز چیزای زیادی راجع بهش هست که باید یاد بگیریم ولی فعلا کافیهtake it easy ...مثل همیشهمراقبت از خودتون اولین اولویت باشه که فردا ها همدیگه رو ببینیمبه یاد جادی میرمیرانی عزیز