طبق این پروپوزال، امکان استفاده از generic به نسخه Go 1.18 اضافه میشود و در سال 2022 منتشر خواهد شد. اما نکته جالب در مورد تغییر این است بر خلاف بیشتر زبانها که مفهوم جنریک با
Foo<T>
نماش داده میشود، در Go این مفهوم به صورت Foo[T]
نمایش داده خواهد شد و برای این تصمیم هم دلیل جالبی وجود دارد که در این مستند توضیح داده شدهاست.نکته جالبتر این است که این چالش هنگامی که Generic به زبان C# در نسخه 2.0 هم اضافه شد وجود داشت و باعث ایجاد یک Breaking Change از نسخه 1.0 به نسخه 2.0 شد. در این پست سعی میکنم این مشکل را با یک مثال از توییتی که Eric Lippert در این مورد زده توضیح بدم.
عبارت زیر را در نظر بگیرید:
A(B<C,D>E()) این عبارت در نسخه 1.0 و در نسخه 2.0 به دو طریق مختلف ترجمه میشود. که در کد زیر سعی کردم با فاصلهگذاریهای متفاوت آن را نشان دهم.
// C# 1.0همانطور که میبینید در نسخه 1.0، فراخوانی متد
A( B<C , D>E() )
// C# 2.0
A( B<C,D> E() )
A با دو پارامتر ورودی انجام شده و علامت < و > به عنوان علامتهای کوچکتری و بزرگتری تفسیر شدهاند، اما در نسخه 2.0 این عبارت فراخوانی متد A با یک ورودی جنریک است.نکته جالب دیگر این است که generics به عنوان یک ویژگی بسیار مهم، تقریبا در سال 2002 به C# اضافه شد و پس از ۲۰ سال قرار است به زبان Go اضافه شود.
در این مدت برخی طرفداران زبان Go نبود این امکان را این گونه توجیه میکردند که این یک نقص نیست و تصمیم طراحی بوده که این زبان این امکان را نداشته باشد. به هر حال دیگر نیازی به توجیه نیست و از این به بعد هنگام استفاده از زبان قدرتمند Go از generic ها هم میتوانید استفاده کنید.
https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
________