Backend Developer at ArvanCloud
جنریک ها در گولنگ
حتما میدونید که گولنگ یک زبان تایپ ثابت هست, یعنی اینکه هر متغیر داخل برنامه شما باشه حتما یک تایپ از قبل مشخص شده داره. مثلا وقتی که یک فانکشن تعریف میکنیم باید حتما نوع پارامتر هایی که فانکشن میگیره رو مشخص کنیم مثل کد زیر:
func Print(s string) {
اینجا ما اومدیم یه پارامتر رو تعریف کردیم با اسم s و تایپ string، ما میتونیم هر تعداد پارامتر دیگهای که خواستیم با هر تایپی مثل float64، int، struct تعریف کنیم. ولی مشکل اینجا بوجود میاد که نمیتونیم یک عدد به این فانکشن پاس بدیم چون عددها از جنس int هستن و نمیشه یه int توی یک متغیر string بریزیم.
قبلا ما میومدیم تایپ پارامتر s رو از نوع interface تعریف میکردیم، که این مشکل تا حدودی حل میشد، ولی باز هم محدودیتها زیادی داشتیم.
جنریک ها
اینجا بود که ما برای حل این مشکل اومدیم از چیزی به اسم جنریکها استفاده کردیم.
بریم با هم توی کد امتحان کنیم:
func PrintAnything[T any](thing T) { fmt.Println(thing) }
بهتر نشد؟ ما جنریکی به اسم T تعریف کردیم که میتونه هر تایپی رو بگیره و یک پارامتر تعریف کردیم از نوع جنریک T اینطوری میتونیم هرچیزی به این فانکشن پاس بدیم تا پرینت کنه واسمون به همین سادگی:
PrintAnything("Hello!")
PrintAnything(42)
PrintAnything(true)
زمانی که این فانکشن فراخوانی میکنیم پارامتر thing همون لحظه با مقداری که بهش پاس میدیم تایپش مشخص میشه.
جنریک تایپ ها
تا اینجا که خیلی باحال بود, ما تونستیم یه فانکشن بنویسیم که میتونه یک آرگومان از هر تایپی بگیره.
حالا اگر بخوایم یه تایپ بسازیم که بتونه هر نوعی داشته باشه چی؟ مثلا یه slice از هر چیزی.
بله جنریک ها داخل تعریف تایپ هم کاربرد دارند ما میتونیم اینطوری این تایپ تعریف کنیم:
type Bunch[E any] []E
اینجا ما میگیم که تایپ Bunch یک اسلایس از نوع مشخصی به اسم E هست, حالا خود همین E یه جنریک هست که از هر چیزی میتونه باشه برای مثال Bunch[int] یک slice از نوع int هست.
مثال در کد:
x := Bunch[int]{1, 2, 3}
ما میتونیم از این نوع تایپ توی فانکشن ها هم استقاده کنیم:
func PrintBunch[E any](b Bunch[E]) {
حتی میتونه متود داشته باشه :
func (b Bunch[E]) Print() {
ما میتونیم یکسری محدودیت ها و شروط تعریف کنیم برای جنریک ها, مثلا میتونیم بگیم جنریک فقط string قبول کنه. مثل کد زیر:
type StringableBunch[E Stringer] []E
این قابلیت روی نسخه 1.18 به بعد گولنگ وجود داره. ( از این لینک میتونید نسخه ی 1.18-beta گولنگ دریافت کنید)
اگر هم به هر دلیل نمیتونین این ورژن از گو نصب کنید میتونید از این لینک برین و داخل مرورگرتون تست کنین.
امیدوارم توضیحاتم مفید بوده باشه. توضیحات تکمیلی رو می تونید توی این لینک ببینید. اگه براتون مفید بود و خوشتون اومد، لایک یادتون نره! انتقادات و پیشنهادات هم میتونید توی نظرات بهم بگین.
مطلبی دیگر از این انتشارات
چرا برای هندلکردن خطاها در گولنگ از RichError استفاده کنیم؟
مطلبی دیگر از این انتشارات
آموزش golang - قدم هفتم: عملگرها
مطلبی دیگر از این انتشارات
خلاصه مختصر مفید GoLang (پارت اول)