যখন Go 1.18 2022 সালে জেনেরিক্স চালু করে, তখন এটি ফাংশন এবং স্ট্রাক্টে জেনেরিক টাইপ প্যারামিটার আনে, কিন্তু পদ্ধতিগুলিকে বাদ দেয়। Go 1.27-এর মুক্তির সাথে, এই সীমাবদ্ধতাটি মুছে ফেলা হয়েছে। এখন পদ্ধতিগুলি প্রাপ্তকারী স্ট্রাক্টে যোগ না করেই নিজস্ব টাইপ প্যারামিটার নির্ধারণ করতে পারে।
এই পরিবর্তনটি কেন চালু করা হয়েছে? যদি আপনি একটি গ্রাফ নোড তৈরি করতে চান যা একটি জেনেরিক মান ধরে রাখে, তাহলে আপনি এটি এভাবে বাস্তবায়ন করতে পারেন:
type Node[T any] struct {
value T
}
কল্পনা করুন যে আপনি একটি Map পদ্ধতি যোগ করছেন যা টাইপ T-এর একটি নোডকে অন্য টাইপ U-এর একটি নোডে রূপান্তর করে। Go 1.27 আগে, আপনাকে U-কে সরাসরি Node স্ট্রাক্টে যোগ করতে বাধ্য হতাম:
type Node[T any, U any] struct {
value T
}
func (n *Node[T, U]) Map() Node[T, U] {
// ...
}
U-কে স্ট্রাক্টে যোগ করা একটি খারাপ ডিজাইন কারণ U হল Map-এর একটি নির্দিষ্ট টাইপ প্যারামিটার। যদিও অন্যান্য পদ্ধতিগুলি U ব্যবহার করবে না, তবুও তাদের এখনও তাদের রিসিভার ঘোষণায় এটি রাখতে হবে। একমাত্র সমাধান ছিল Map-কে প্যাকেজ-স্তরের ফাংশন হিসাবে বাস্তবায়ন করা, পদ্ধতি নয়, কারণ ফাংশনরা নিজস্ব টাইপ প্যারামিটার নির্ধারণ করতে পারে। কিন্তু পদ্ধতিগুলি পারত না, যা কোড API ডিজাইনকে অজীব এবং অগ্রাহ্য করে তোলে। Go 1.27 থেকে শুরু করে, U কে Map পদ্ধতিতে আলাদাভাবে পরিভাষিত করা যাতে পারে:
func (n *Node[T]) Map[U any]() Node[U] {
// ...
}
কেন এত দীর্ঘ সময় লাগল? উত্তর আছে Go-এ জেনেরিক্স কীভাবে বাস্তবায়িত হয় তার মধ্যে। কম্পাইলার জেনেরিক্স প্রধান্যত মোনোমরফাইজেশনের মাধ্যমে পরিচালনা করে, অর্থাৎ এটি প্রতিটি নির্দিষ্ট টাইপের জন্য জেনেরিক স্ট্রাক্ট বা ফাংশনের একটি অনুলিপি তৈরি করবে। কারণ কোনো সময়ে, জেনেরিক্সের বিশুদ্ধ ধারণাটি সরাসরি মেশিন কোডে অনূদিত হওয়া প্রয়োজন। তবে, Go-এর ইন্টারফেস সিস্টেম রানটাইমে কাজ করে। ইন্টারফেস প্যারামিটারে পাস করা একটি মানের নির্দিষ্ট টাইপটি প্রোগ্রাম চালানোর সময় সমাধান করা হয়। এই গতিশীল বিতরণ জেনেরিক্সকে সম্পূর্ণ করার সময়ের সাথে টকরা হয়। বিবেচনা করুন যদি আমরা আমাদের Map পদ্ধতিটি একটি ইন্টারফেসে ঘোষণা করতে চাই:
type Mapper interface {
Map T any, U any U
}
এটি কাজ করতে হলে, রানটাইমকে হয়তো Just-In-Time কম্পাইলার দরকার হবে যা নির্দিষ্ট টাইপের জন্য মেশিন কোড তৈরি করে, অথবা এই অনুলিপিগুলি প্রতিটি সম্ভাব্য টাইপের জন্য আগে থেকে তৈরি করতে হবে, ফলে বাইনারি বিশাল আকারে ফুলে ওঠে। শেষ পর্যন্ত, Go দল জেনেরিক পদ্ধতিগুলিকে ইন্টারফেস থেকে আলাদা করার সিদ্ধান্ত নিয়। Go 1.27 বাস্তব টাইপে জেনেরিক পদ্ধতিগুলির অনুমতি দেয়, কিন্তু ইন্টারফেসে নয়। এই পার্থক্যই হল যার ফলে উপরের উদাহরণটি কম্পাইল হয় না এবং এর চারপাশে আলোচনাগুলি কতটা সময় নিয়েছিল তা।
উৎস: Hacker News · সারাংশ: HeadlinesBriefing