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

পদ্ধতি: মান বনাম পয়েন্টার রিসিভার

Go-তে একটি পদ্ধতি হল একটি রিসিভার সহ একটি ফাংশন: একটি বিশেষ৷ func এবং পদ্ধতির নামের মধ্যে ঘোষিত প্যারামিটার, যা আবদ্ধ করে একটি প্রকারের পদ্ধতি। কোন ক্লাস নেই: পদ্ধতি সংজ্ঞায়িত করা যেতে পারে বর্তমান প্যাকেজে ঘোষিত যে কোনো নামকৃত প্রকার।

সিনট্যাক্স

Go
type Person struct {
    Name string
}

func (p Person) Greet() string {
    return "ciao " + p.Name
}

p := Person{Name: "Ada"}
fmt.Println(p.Greet())   // "ciao Ada"

রিসিভার p Person Greet কে Person এর একটি পদ্ধতি তৈরি করে। ভিতরে পদ্ধতি, p অন্য যে কোনো একটির মত একটি পরিবর্তনশীল।

মান রিসিভার বনাম পয়েন্টার রিসিভার

Go
// VALUE receiver: operates on a COPY of the value
func (p Person) NameUpper() string {
    return strings.ToUpper(p.Name)
}

// POINTER receiver: operates on the original value, can mutate it
func (p *Person) Rename(n string) {
    p.Name = n
}

একটি পয়েন্টার রিসিভারের সাহায্যে আপনি রিসিভার পরিবর্তন করতে পারবেন এবং পরিবর্তনগুলি পদ্ধতির বাইরে দৃশ্যমান। একটি মান রিসিভার সঙ্গে আপনি পারবেন না — আপনি চাই শুধুমাত্র স্থানীয় অনুলিপি পরিবর্তন করুন।

Go
p := Person{Name: "Ada"}
p.Rename("Grace")
fmt.Println(p.Name)   // "Grace" — change is visible

কখন পয়েন্টার রিসিভার ব্যবহার করবেন

ব্যবহারিক নিয়ম, অগ্রাধিকার অনুযায়ী:

  1. আপনাকে অবশ্যই রিসিভার পরিবর্তন করতে হবে → পয়েন্টার রিসিভার। বাধ্যতামূলক।
  2. স্ট্রাকটটি বড় (ডজন ক্ষেত্র, ভিতরে অ্যারে) → পয়েন্টার দামী কপি এড়াতে রিসিভার।
  3. সংগতি: যদি টাইপের অন্তত একটি পদ্ধতিতে একটি পয়েন্টার রিসিভার থাকে, তাহলে ব্যবহার করুন অন্যদের জন্যও একটি পয়েন্টার রিসিভার। জন্য একটি অত্যন্ত গুরুত্বপূর্ণ সম্মেলন ইন্টারফেস (মডিউল 6)।
  4. ছোট, অপরিবর্তনীয়, "মান" প্রকার (সময়। সময়, জটিল সংখ্যা, ছোট structs) → মান রিসিভার, আরও পাঠযোগ্য।

নন-স্ট্রাকট প্রকারের পদ্ধতি

আপনি আপনার প্যাকেজে ঘোষিত যেকোন NAMED প্রকারের পদ্ধতি সংজ্ঞায়িত করতে পারেন:

Go
type Celsius float64

func (c Celsius) ToFahrenheit() float64 {
    return float64(c)*9/5 + 32
}

t := Celsius(20)
fmt.Println(t.ToFahrenheit())  // 68

আপনি অন্য প্যাকেজগুলির প্রকারের উপর তাদের সংজ্ঞায়িত করতে পারবেন না (যেমন int, string): আপনাকে অবশ্যই প্রথমে একটি স্থানীয় নামের টাইপ তৈরি করুন।

চেষ্টা করে দেখুন

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

'ciao <Name>' প্রদানকারী ব্যক্তির সাথে একটি Greet() স্ট্রিং পদ্ধতি (মান রিসিভার) যোগ করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

পদ্ধতির নামের আগে বন্ধনীতে রিসিভার।

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

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

একটি POINTER রিসিভারের সাথে একটি Rename(n স্ট্রিং) পদ্ধতি যোগ করুন যা p.Name পরিবর্তন করে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

পয়েন্টার রিসিভার: `(p *ব্যক্তি)`।

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

Quiz#go.m5.l2.e3
প্রস্তুত

আপনি কখন একটি পয়েন্টার রিসিভার (p *T) ব্যবহার করবেন?

Go
func (t ?T) M() { ... }
উত্তরের বিকল্প

রিক্যাপ

  • পদ্ধতি = একটি রিসিভার সহ ফাংশন: func (r T) Name(...) ... { ... }।
  • মান রিসিভার: একটি অনুলিপি কাজ করে; পয়েন্টার রিসিভার: মূলে কাজ করে।
  • Go কল সাইটে স্বয়ংক্রিয়ভাবে T ↔ *T রূপান্তর সম্পাদন করে।
  • পয়েন্টার রিসিভার যখন: মিউটেশন + বড় স্ট্রাকট + টাইপের অন্যান্য পদ্ধতির সাথে সামঞ্জস্য।
  • একই ধরনের মান এবং পয়েন্টার রিসিভার মিশ্রিত করবেন না।
  • বর্তমান প্যাকেজে (নন-স্ট্রাকট সহ) পদ্ধতিগুলি NAMED প্রকারে চলে।