মডিউল পাঠ (2/5)
পদ্ধতি: মান বনাম পয়েন্টার রিসিভার
Go-তে একটি পদ্ধতি হল একটি রিসিভার সহ একটি ফাংশন: একটি বিশেষ৷
func এবং পদ্ধতির নামের মধ্যে ঘোষিত প্যারামিটার, যা আবদ্ধ করে
একটি প্রকারের পদ্ধতি। কোন ক্লাস নেই: পদ্ধতি সংজ্ঞায়িত করা যেতে পারে
বর্তমান প্যাকেজে ঘোষিত যে কোনো নামকৃত প্রকার।
সিনট্যাক্স
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 অন্য যে কোনো একটির মত একটি পরিবর্তনশীল।
মান রিসিভার বনাম পয়েন্টার রিসিভার
// 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
}একটি পয়েন্টার রিসিভারের সাহায্যে আপনি রিসিভার পরিবর্তন করতে পারবেন এবং পরিবর্তনগুলি পদ্ধতির বাইরে দৃশ্যমান। একটি মান রিসিভার সঙ্গে আপনি পারবেন না — আপনি চাই শুধুমাত্র স্থানীয় অনুলিপি পরিবর্তন করুন।
p := Person{Name: "Ada"}
p.Rename("Grace")
fmt.Println(p.Name) // "Grace" — change is visibleকখন পয়েন্টার রিসিভার ব্যবহার করবেন
ব্যবহারিক নিয়ম, অগ্রাধিকার অনুযায়ী:
- আপনাকে অবশ্যই রিসিভার পরিবর্তন করতে হবে → পয়েন্টার রিসিভার। বাধ্যতামূলক।
- স্ট্রাকটটি বড় (ডজন ক্ষেত্র, ভিতরে অ্যারে) → পয়েন্টার দামী কপি এড়াতে রিসিভার।
- সংগতি: যদি টাইপের অন্তত একটি পদ্ধতিতে একটি পয়েন্টার রিসিভার থাকে, তাহলে ব্যবহার করুন অন্যদের জন্যও একটি পয়েন্টার রিসিভার। জন্য একটি অত্যন্ত গুরুত্বপূর্ণ সম্মেলন ইন্টারফেস (মডিউল 6)।
- ছোট, অপরিবর্তনীয়, "মান" প্রকার (সময়। সময়, জটিল সংখ্যা, ছোট structs) → মান রিসিভার, আরও পাঠযোগ্য।
নন-স্ট্রাকট প্রকারের পদ্ধতি
আপনি আপনার প্যাকেজে ঘোষিত যেকোন NAMED প্রকারের পদ্ধতি সংজ্ঞায়িত করতে পারেন:
type Celsius float64
func (c Celsius) ToFahrenheit() float64 {
return float64(c)*9/5 + 32
}
t := Celsius(20)
fmt.Println(t.ToFahrenheit()) // 68আপনি অন্য প্যাকেজগুলির প্রকারের উপর তাদের সংজ্ঞায়িত করতে পারবেন না (যেমন int, string): আপনাকে অবশ্যই
প্রথমে একটি স্থানীয় নামের টাইপ তৈরি করুন।
চেষ্টা করে দেখুন
'ciao <Name>' প্রদানকারী ব্যক্তির সাথে একটি Greet() স্ট্রিং পদ্ধতি (মান রিসিভার) যোগ করুন।
ইঙ্গিত দেখান
পদ্ধতির নামের আগে বন্ধনীতে রিসিভার।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
একটি POINTER রিসিভারের সাথে একটি Rename(n স্ট্রিং) পদ্ধতি যোগ করুন যা p.Name পরিবর্তন করে।
ইঙ্গিত দেখান
পয়েন্টার রিসিভার: `(p *ব্যক্তি)`।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
আপনি কখন একটি পয়েন্টার রিসিভার (p *T) ব্যবহার করবেন?
func (t ?T) M() { ... }রিক্যাপ
- পদ্ধতি = একটি রিসিভার সহ ফাংশন:
func (r T) Name(...) ... { ... }। - মান রিসিভার: একটি অনুলিপি কাজ করে; পয়েন্টার রিসিভার: মূলে কাজ করে।
- Go কল সাইটে স্বয়ংক্রিয়ভাবে
T↔*Tরূপান্তর সম্পাদন করে। - পয়েন্টার রিসিভার যখন: মিউটেশন + বড় স্ট্রাকট + টাইপের অন্যান্য পদ্ধতির সাথে সামঞ্জস্য।
- একই ধরনের মান এবং পয়েন্টার রিসিভার মিশ্রিত করবেন না।
- বর্তমান প্যাকেজে (নন-স্ট্রাকট সহ) পদ্ধতিগুলি NAMED প্রকারে চলে।