Go-তে Methods এবং Receiver Functions এর ব্যবহার
১. Methods (মেথডস) কী?
Go প্রোগ্রামিং ভাষায়, Methods হল ফাংশন যেগুলি একটি নির্দিষ্ট টাইপের সাথে সম্পর্কিত থাকে। একটি Method সাধারণত একটি struct টাইপের উপর কার্যকরী হয়ে থাকে, তবে এটি অন্য যেকোনো টাইপের জন্যও হতে পারে।
Methods এবং সাধারণ functions মধ্যে পার্থক্য হলো, methods-এ একটি receiver থাকে, যা সেই টাইপ বা struct এর মান বা পয়েন্টারকে গ্রহণ করে।
২. Receiver Functions (রিসিভার ফাংশন)
Receiver হল একটি বিশেষ ধরনের প্যারামিটার যা method-এর অংশ হয়। এটি সেই টাইপ বা struct-টি নির্দেশ করে যার জন্য method তৈরি করা হয়েছে। একে আপনি কিপর্যন্ত value receiver বা pointer receiver হিসেবে ব্যবহার করতে পারেন।
২.১ Method Receiver Types
- Value Receiver: ফাংশনটি টাইপের একটি কপি নিয়ে কাজ করে। অর্থাৎ, যে টাইপের উপর method কাজ করছে, তার একটি কপি তৈরি হয় এবং method তার উপর কাজ করে।
- Pointer Receiver: ফাংশনটি টাইপের পয়েন্টার নিয়ে কাজ করে। অর্থাৎ, method সেই টাইপের মেমরি অ্যাড্রেস ব্যবহার করে কাজ করে, ফলে টাইপটির মান সরাসরি পরিবর্তন করা যেতে পারে।
৩. Method Definition in Go
Go-তে method ডিফাইন করতে, func কিওয়ার্ড ব্যবহার করা হয় এবং ফাংশনের আগে receiver প্যারামিটার দেওয়া হয়। এটি সাধারণত struct টাইপের উপরে method হিসেবে ডিফাইন করা হয়।
৩.১ Method Definition with Value Receiver
package main
import "fmt"
// Person struct ডিফাইন করা
type Person struct {
Name string
Age int
}
// Method তৈরি করা, value receiver ব্যবহার করা
func (p Person) Greet() {
fmt.Println("Hello, my name is", p.Name)
}
func main() {
p1 := Person{Name: "Alice", Age: 25}
p1.Greet() // Method কল করা
}এখানে, Greet একটি method যা Person struct-এর মান (value) গ্রহণ করছে। অর্থাৎ, p হল একটি value receiver, যা p1 struct-এর কপি গ্রহণ করে।
আউটপুট:
Hello, my name is Alice৩.২ Method Definition with Pointer Receiver
package main
import "fmt"
// Person struct ডিফাইন করা
type Person struct {
Name string
Age int
}
// Method তৈরি করা, pointer receiver ব্যবহার করা
func (p *Person) CelebrateBirthday() {
p.Age++
fmt.Println("Happy Birthday! You are now", p.Age, "years old.")
}
func main() {
p1 := &Person{Name: "Bob", Age: 30}
p1.CelebrateBirthday() // Method কল করা
}এখানে, CelebrateBirthday method একটি pointer receiver হিসেবে ডিফাইন করা হয়েছে। p *Person অর্থ, p1-এর মেমরি অ্যাড্রেস (pointer) ব্যবহার করা হয়েছে, যার মাধ্যমে আপনি struct-এর মান পরিবর্তন করতে পারেন।
আউটপুট:
Happy Birthday! You are now 31 years old.এখানে, p1 struct-এর মান সরাসরি পরিবর্তিত হয়েছে কারণ এটি একটি pointer receiver।
৪. Method and Function Comparison
- Function: সাধারণ ফাংশন শুধুমাত্র একটি প্যারামিটার গ্রহণ করে এবং এক্সিকিউট করা হয়।
- Method: method একটি receiver গ্রহণ করে, যা একটি নির্দিষ্ট টাইপের উপর কাজ করে। method শুধুমাত্র সেই টাইপের উপরই কাজ করতে পারে।
৪.১ Function Example
package main
import "fmt"
// সাধারণ ফাংশন
func Greet(name string) {
fmt.Println("Hello,", name)
}
func main() {
Greet("Alice") // Function কল করা
}৪.২ Method Example
package main
import "fmt"
// Person struct ডিফাইন করা
type Person struct {
Name string
Age int
}
// Person struct-এর উপর method
func (p Person) Greet() {
fmt.Println("Hello, my name is", p.Name)
}
func main() {
p1 := Person{Name: "Alice", Age: 25}
p1.Greet() // Method কল করা
}৫. Method Overloading
Go তে method overloading (একই নামের একাধিক method) সমর্থন করা হয় না। তবে আপনি ভিন্ন প্যারামিটার বা টাইপ দিয়ে ফাংশন তৈরি করে একই রকম কার্যকলাপ করতে পারেন।
৫.১ Method Overloading Workaround
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p Person) Greet() {
fmt.Println("Hello, my name is", p.Name)
}
func (p Person) GreetWithAge() {
fmt.Println("Hello, my name is", p.Name, "and I am", p.Age, "years old.")
}
func main() {
p1 := Person{Name: "Alice", Age: 25}
p1.Greet() // আউটপুট: Hello, my name is Alice
p1.GreetWithAge() // আউটপুট: Hello, my name is Alice and I am 25 years old.
}এখানে, দুটি আলাদা method ব্যবহার করা হয়েছে: একটিতে শুধু Name, এবং অন্যটিতে Name এবং Age। Go method overloading সমর্থন না করলেও, ভিন্ন নামের method তৈরি করে আপনি একই কার্যকলাপ সঞ্চালন করতে পারেন।
৬. Method Chaining
Go তে method chaining ব্যবহার করা যেতে পারে যেখানে একাধিক method একে একে কল করা হয়। এজন্য একটি method এর রিটার্ন ভ্যালু ব্যবহার করা হয় যা পরবর্তী method কে কল করতে সাহায্য করে।
৬.১ Method Chaining উদাহরণ
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) SetName(name string) *Person {
p.Name = name
return p // চেইনিংয়ের জন্য পয়েন্টার ফেরত
}
func (p *Person) SetAge(age int) *Person {
p.Age = age
return p // চেইনিংয়ের জন্য পয়েন্টার ফেরত
}
func main() {
p1 := &Person{}
p1.SetName("Alice").SetAge(25) // Method Chaining
fmt.Println(p1) // আউটপুট: &{Alice 25}
}এখানে, SetName এবং SetAge দুটি method চেইনিংয়ের মাধ্যমে একে একে কল করা হয়েছে। return p দ্বারা struct এর পয়েন্টার ফিরে আসছে, যার মাধ্যমে method chaining সম্ভব হচ্ছে।
সারসংক্ষেপ
- Methods: Go তে methods হল ফাংশন যা একটি receiver টাইপ (অথবা struct) এর সাথে সম্পর্কিত থাকে এবং এটি সেই টাইপের ডেটার উপর কাজ করে।
- Receiver Functions: Receiver হল একটি প্যারামিটার যা method-এ ব্যবহার করা হয় এবং এটি struct বা টাইপের উপর কাজ করে। এটি value receiver অথবা pointer receiver হতে পারে।
- Method Chaining: Go তে আপনি method chaining করতে পারেন, যেখানে একাধিক method একে একে কল করা হয়। এজন্য method গুলি পয়েন্টার ফেরত দেয়।
Go তে Methods এবং Receiver Functions এর ব্যবহার আপনার কোডের কার্যকারিতা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক।
Read more