মূল কন্টেন্টে যান
মডিউল 10 · 3-এর পাঠ 5কোর্সে 48/50~15 min
মডিউল পাঠ (3/5)

জেনেরিক (1.18+ যান)

Go 1.18 (মার্চ 2022) থেকে, টাইপ প্যারামিটার উপলভ্য: ফাংশন এবং প্রকারগুলি প্রকারের উপর প্যারামিটারাইজ করা যেতে পারে। তারা আপনাকে Map, Filter, Set[T], LinkedList[T] সদৃশ কোড ছাড়া এবং interface{} + রানটাইম টাইপ দাবী ছাড়াই লিখতে দেয়৷

জেনেরিক ফাংশন: সিনট্যাক্স

Go
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 সমতার অনুমতি দেয় কিন্তু না < বা >।

Go
func Index[T comparable](s []T, x T) int {
    for i, v := range s {
        if v == x { return i }
    }
    return -1
}

</> এর জন্য আপনার একটি কাস্টম সীমাবদ্ধতা প্রয়োজন৷

কাস্টম সীমাবদ্ধতা: টাইপ ইউনিয়ন

একটি সীমাবদ্ধতা হল একটি ইন্টারফেস যেখানে "টাইপ এলিমেন্ট" ক্লজ রয়েছে:

Go
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।

একটি সীমাবদ্ধতা পদ্ধতি মিশ্রিত করতে পারে এবং উপাদানগুলি টাইপ করতে পারে:

Go
type Stringable interface {
    ~string
    Len() int
}

জেনেরিক প্রকার

শুধু ফাংশনই নয়: স্ট্রাকট এবং ইন্টারফেসেও টাইপ প্যারামিটার থাকতে পারে।

Go
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)।
  • আপনি প্যারামিটারাইজ করছেন "কারণ আপনি পারেন": একটি একক ব্যবহারের ক্ষেত্রে → এটির একটি কংক্রিট সংস্করণ তৈরি করুন।

ব্যায়াম

ব্যায়াম#go.m10.l3.e1
প্রচেষ্টা: 0লোড হচ্ছে...

Definisci la funzione generica Min[T Ordered](a, b T) T che ritorna il minore usando l'operatore <. Il সীমাবদ্ধতা আদেশ è già fornito.

সম্পাদক লোড হচ্ছে...

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m10.l3.e2
প্রচেষ্টা: 0লোড হচ্ছে...

মানচিত্র প্রয়োগ করুন

সম্পাদক লোড হচ্ছে...

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m10.l3.e3
প্রস্তুত

কোয়ালে সীমাবদ্ধতা অন্তর্নির্মিত সম্মতি l'operatore == ma NON l'operatore <?

Go
func Index[T ???](s []T, x T) int { ... }
উত্তরের বিকল্প