মডিউল পাঠ (3/5)
জেনেরিক (1.18+ যান)
Go 1.18 (মার্চ 2022) থেকে, টাইপ প্যারামিটার উপলভ্য: ফাংশন এবং প্রকারগুলি প্রকারের উপর প্যারামিটারাইজ করা যেতে পারে। তারা আপনাকে Map, Filter, Set[T], LinkedList[T] সদৃশ কোড ছাড়া এবং interface{} + রানটাইম টাইপ দাবী ছাড়াই লিখতে দেয়৷
জেনেরিক ফাংশন: সিনট্যাক্স
func Map[T, U any](s []T, f func(T) U) []U {
out := make([]U, len(s))
for i, v := range s {
out[i] = f(v)
}
return out
}
doubled := Map([]int{1, 2, 3}, func(n int) int { return n * 2 })
// doubled is []int{2, 4, 6}তিনটি নতুন উপাদান:
[T, U any]নামের পরে: টাইপ প্যারামিটারগুলি তাদের সীমাবদ্ধতার সাথে ঘোষণা করে।any= সীমাবদ্ধতা যা যেকোনো প্রকারকে গ্রহণ করে (interface{}এর উপনাম Go 1.18 থেকে)।- অনুমান:
Map([]int{...}, ...)এ কল করলে আপনাকেMap[int, int](...)লিখতে হবে না: কম্পাইলার অনুমান করেT=int, U=int।
কখনও কখনও অনুমান যথেষ্ট হয় না (যেমন, কোন T আর্গুমেন্ট ছাড়া কনস্ট্রাক্টর) এবং সুস্পষ্ট ইনস্ট্যান্টেশন প্রয়োজন হয়: New[*Server]()।
অন্তর্নির্মিত সীমাবদ্ধতা
| সীমাবদ্ধতা | অর্থ |
|---|---|
any | যেকোনো প্রকার (== interface{})। |
comparable | == এবং != সহ প্রকার: সংখ্যাসূচক, স্ট্রিং, বুল, পয়েন্টার, চ্যানেল, তুলনাযোগ্য অ্যারে/স্ট্রাক্ট। |
comparable সমতার অনুমতি দেয় কিন্তু না < বা >।
func Index[T comparable](s []T, x T) int {
for i, v := range s {
if v == x { return i }
}
return -1
}</> এর জন্য আপনার একটি কাস্টম সীমাবদ্ধতা প্রয়োজন৷
কাস্টম সীমাবদ্ধতা: টাইপ ইউনিয়ন
একটি সীমাবদ্ধতা হল একটি ইন্টারফেস যেখানে "টাইপ এলিমেন্ট" ক্লজ রয়েছে:
type Ordered interface {
~int | ~int64 | ~float64 | ~string
}
func Min[T Ordered](a, b T) T {
if a < b { return a }
return b
}|= ইউনিয়ন: তালিকাভুক্ত যেকোনো প্রকারকে গ্রহণ করে।~int= "int বা যেকোনো প্রকারtype X intহিসাবে সংজ্ঞায়িত" (একই অন্তর্নিহিত প্রকারের সাথে)।~ছাড়া, শুধুমাত্র সঠিকint।
একটি সীমাবদ্ধতা পদ্ধতি মিশ্রিত করতে পারে এবং উপাদানগুলি টাইপ করতে পারে:
type Stringable interface {
~string
Len() int
}জেনেরিক প্রকার
শুধু ফাংশনই নয়: স্ট্রাকট এবং ইন্টারফেসেও টাইপ প্যারামিটার থাকতে পারে।
type Set[T comparable] struct {
m map[T]struct{}
}
func NewSet[T comparable]() *Set[T] {
return &Set[T]{m: make(map[T]struct{})}
}
func (s *Set[T]) Add(v T) { s.m[v] = struct{}{} }
func (s *Set[T]) Has(v T) bool { _, ok := s.m[v]; return ok }
s := NewSet[string]()
s.Add("ada")পদ্ধতিগুলি টাইপের প্যারামিটারগুলির বাইরে টাইপ প্যারামিটার যোগ করতে পারে না: func (s *Set[T]) MapTo[U any](...) সংকলন করে না (ইচ্ছাকৃত নকশা সীমাবদ্ধতা)।
জেনেরিক কখন ব্যবহার করবেন
হ্যাঁ যখন:
- যুক্তিটি সত্যই অভিন্ন বিভিন্ন প্রকারের (সংগ্রহ, অ্যালগরিদম, সাহায্যকারী যেমন
Map/Filter/Reduce)। - বিকল্পটি হবে নকল কোড বা
interface{}+ প্রকার দাবী (টাইপ নিরাপত্তা হারানো) ব্যবহার করা।
না যখন:
- এক বা দুটি পদ্ধতি সহ একটি ইন্টারফেস যথেষ্ট এবং আরও পাঠযোগ্য (
io.Reader,fmt.Stringer)। - আপনি প্যারামিটারাইজ করছেন "কারণ আপনি পারেন": একটি একক ব্যবহারের ক্ষেত্রে → এটির একটি কংক্রিট সংস্করণ তৈরি করুন।
ব্যায়াম
Definisci la funzione generica Min[T Ordered](a, b T) T che ritorna il minore usando l'operatore <. Il সীমাবদ্ধতা আদেশ è già fornito.
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
মানচিত্র প্রয়োগ করুন
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
কোয়ালে সীমাবদ্ধতা অন্তর্নির্মিত সম্মতি l'operatore == ma NON l'operatore <?
func Index[T ???](s []T, x T) int { ... }