Go-তে Structs এবং Methods (স্ট্রাক্ট এবং মেথড)
Go-তে Structs এবং Methods হল দুটি গুরুত্বপূর্ণ ফিচার যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP)-এর বৈশিষ্ট্য সম্পন্ন করতে ব্যবহৃত হয়। Structs হল কাস্টম ডেটা টাইপ যা একাধিক ভেরিয়েবল (ফিল্ড) ধারণ করতে পারে, এবং Methods হল ফাংশন যা নির্দিষ্ট টাইপের সাথে সম্পর্কিত থাকে এবং সেই টাইপের উপর কাজ করে।
১. Structs (স্ট্রাক্ট)
Struct হল একটি কাস্টম ডেটা টাইপ যা একাধিক ভিন্ন ধরনের ডেটাকে একত্রিত করে। এটি একটি গ্রুপিং কনসেপ্ট যেখানে আপনি সম্পর্কিত তথ্যগুলিকে একটি একক টাইপে সংরক্ষণ করতে পারেন। Structs সাধারণত ডেটা সংরক্ষণের জন্য ব্যবহৃত হয় এবং এতে ভিন্ন টাইপের ফিল্ড থাকতে পারে।
১.১ Struct ডিফাইনেশন
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
Height float64
}
func main() {
// Struct ইনস্ট্যান্স তৈরি
p1 := Person{
Name: "John",
Age: 30,
Height: 5.9,
}
fmt.Println(p1)
}এখানে, Person একটি struct টাইপ, যা তিনটি ফিল্ড (Name, Age, Height) ধারণ করে। এবং p1 একটি Person টাইপের ইনস্ট্যান্স যা স্ট্রাকচার ডেটার মান ধারণ করছে।
আউটপুট:
{John 30 5.9}১.২ Struct ফিল্ড অ্যাক্সেস
Struct ফিল্ড অ্যাক্সেস করতে . ডট অপারেটর ব্যবহার করা হয়।
fmt.Println(p1.Name) // আউটপুট: John
fmt.Println(p1.Age) // আউটপুট: 30
fmt.Println(p1.Height) // আউটপুট: 5.9১.৩ Struct এর কনস্ট্রাক্টর ফাংশন
Go-তে আপনি সাধারণভাবে কনস্ট্রাক্টর ফাংশন ব্যবহার করে struct তৈরি করতে পারেন:
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
Height float64
}
// কনস্ট্রাক্টর ফাংশন
func NewPerson(name string, age int, height float64) Person {
return Person{
Name: name,
Age: age,
Height: height,
}
}
func main() {
// Struct ইনস্ট্যান্স তৈরি কনস্ট্রাক্টর ফাংশন ব্যবহার করে
p := NewPerson("Alice", 28, 5.7)
fmt.Println(p)
}এখানে, NewPerson একটি কনস্ট্রাক্টর ফাংশন যা Person struct তৈরি করতে সাহায্য করে।
২. Methods (মেথডস)
Methods হল ফাংশন যা নির্দিষ্ট টাইপের উপর কাজ করে। Go-তে একটি ফাংশনকে টাইপের সাথে সম্পর্কিত করতে, ফাংশনের আগে টাইপের নাম উল্লেখ করতে হয়। এই ফাংশনটি মূলত সেই টাইপের ইনস্ট্যান্সের (যেমন struct) উপর কাজ করে।
২.১ Methods ডিফাইনেশন
Methods ফাংশনের মতো, তবে এর প্রথম আর্গুমেন্টটি একটি টাইপের পয়েন্টার বা ভ্যালু থাকে। যদি আপনি টাইপের ভ্যালু পরিবর্তন করতে চান তবে পয়েন্টার টাইপ ব্যবহার করবেন, আর যদি কেবল পড়তে চান তবে ভ্যালু টাইপ ব্যবহার করবেন।
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
}
// Method তৈরি করা (ভ্যালু টাইপ)
func (p Person) Greet() {
fmt.Println("Hello, my name is", p.Name)
}
// Method তৈরি করা (পয়েন্টার টাইপ)
func (p *Person) HaveBirthday() {
p.Age++
fmt.Println("Happy Birthday! You are now", p.Age, "years old.")
}
func main() {
// Struct ইনস্ট্যান্স তৈরি
p1 := Person{Name: "John", Age: 30}
// Method কল করা
p1.Greet() // আউটপুট: Hello, my name is John
p1.HaveBirthday() // আউটপুট: Happy Birthday! You are now 31 years old.
}এখানে, Greet এবং HaveBirthday হল দুটি method যা Person struct এর ওপর কাজ করে। HaveBirthday method একটি পয়েন্টার টাইপ method, যা p1 struct এর Age ফিল্ড পরিবর্তন করে।
২.২ Methods এবং Struct Pointer
যদি আপনি struct এর ফিল্ড পরিবর্তন করতে চান, তবে আপনি pointer receiver ব্যবহার করবেন। একে pointer method বলা হয়। যদি আপনি শুধুমাত্র struct এর মান পড়তে চান, তবে value receiver ব্যবহার করবেন।
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
}
// Pointer method (Struct এর ফিল্ড পরিবর্তন)
func (p *Person) HaveBirthday() {
p.Age++
fmt.Println("Happy Birthday! You are now", p.Age, "years old.")
}
func main() {
p1 := Person{Name: "Alice", Age: 25}
// পয়েন্টার মেথড কল করা
p1.HaveBirthday() // আউটপুট: Happy Birthday! You are now 26 years old.
}এখানে HaveBirthday method একটি pointer receiver, যা Person struct এর Age ফিল্ড পরিবর্তন করতে সক্ষম।
৩. Methods এর সুবিধা
- Encapsulation: Methods ব্যবহার করে আপনি struct এর সাথে সম্পর্কিত কার্যকলাপ (এবং ফাংশনালিটি) একত্রিত করতে পারেন, যা কোডকে আরও সংগঠিত করে।
- Code Reusability: Methods আপনাকে একই টাইপের ওপর বিভিন্ন কাজ পুনরায় ব্যবহার করার সুযোগ দেয়।
- Data Manipulation: Methods এর মাধ্যমে struct ডেটার পরিবর্তন করা সম্ভব, বিশেষত পয়েন্টার ব্যবহার করলে।
সারসংক্ষেপ
- Structs: Go তে
structহল একটি কাস্টম ডেটা টাইপ যা একাধিক ভিন্ন টাইপের ডেটাকে ধারণ করতে পারে। এটি একটি ডেটা স্ট্রাকচার যা সম্পর্কিত ডেটাকে একত্রিত করে। - Methods: Methods হল ফাংশন যা নির্দিষ্ট টাইপ (যেমন struct) এর সাথে সম্পর্কিত। এটি struct এর ফিল্ড এবং ডেটার ওপর কাজ করে।
- Pointer vs Value Methods:
Value receiverসাধারণত ফাংশনের মধ্যে ডেটা পড়ার জন্য ব্যবহৃত হয়, এবংPointer receiverডেটা পরিবর্তন করতে ব্যবহৃত হয়।
Go তে Structs এবং Methods এর মাধ্যমে আপনি একটি শক্তিশালী এবং সংগঠিত কোডবেস তৈরি করতে পারেন, যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের ধারণা অনুসরণ করে।
Go-তে Structs এর ধারণা এবং এর প্রয়োগ
১. Structs কি?
Struct হলো Go প্রোগ্রামিং ভাষায় একটি কাস্টম ডেটা টাইপ, যা একাধিক ভিন্ন ধরনের ডেটা আইটেম (ফিল্ড) ধারণ করতে সক্ষম। এটি একটি গ্রুপিং কনসেপ্ট যেখানে আপনি সম্পর্কিত ডেটা একত্রিত করে একটি অবজেক্টের মতো তৈরি করতে পারেন। Struct-এ থাকা প্রতিটি ফিল্ডের আলাদা নাম এবং টাইপ থাকে। এটি মূলত ডেটার গ্রুপিং বা ডেটা মডেলিং এর জন্য ব্যবহৃত হয়।
Struct সাধারণত এমন পরিস্থিতিতে ব্যবহার করা হয় যেখানে একাধিক ডেটা আইটেমের সংমিশ্রণ প্রয়োজন হয়, এবং আপনি সেই ডেটা আইটেমগুলির ওপর অপারেশন বা ফাংশন পরিচালনা করতে চান।
২. Struct এর ডিক্লারেশন
Go তে struct ডিক্লেয়ার করতে type কিওয়ার্ড ব্যবহার করা হয়। এর সাধারণ সিনট্যাক্স:
type StructName struct {
FieldName1 FieldType1
FieldName2 FieldType2
// আরও ফিল্ড থাকতে পারে
}এখানে:
StructName: struct এর নামFieldName: struct এর প্রতিটি ফিল্ডের নামFieldType: প্রতিটি ফিল্ডের টাইপ
২.১ Struct ডিক্লারেশন উদাহরণ
package main
import "fmt"
// Struct ডিক্লেয়ার করা
type Person struct {
Name string
Age int
Height float64
}
func main() {
// Struct এর ইনস্ট্যান্স তৈরি
person1 := Person{
Name: "John Doe",
Age: 30,
Height: 5.9,
}
// Struct এর ফিল্ড অ্যাক্সেস করা
fmt.Println(person1) // আউটপুট: {John Doe 30 5.9}
}এখানে, Person একটি struct, যা Name, Age, এবং Height নামে তিনটি ফিল্ড ধারণ করে। person1 নামে একটি struct ইনস্ট্যান্স তৈরি করা হয়েছে এবং এর মান সেট করা হয়েছে।
৩. Struct এর ফিল্ড অ্যাক্সেস এবং ম্যানিপুলেশন
Struct এর ফিল্ডগুলোতে অ্যাক্সেস করতে dot (.) অপারেটর ব্যবহার করা হয়। আপনি struct এর মান পরিবর্তন করতে বা ফিল্ডের মান অ্যাক্সেস করতে এই অপারেটরটি ব্যবহার করবেন।
৩.১ Struct ফিল্ড অ্যাক্সেস
package main
import "fmt"
type Person struct {
Name string
Age int
Height float64
}
func main() {
person1 := Person{Name: "Alice", Age: 25, Height: 5.5}
// Struct ফিল্ড অ্যাক্সেস
fmt.Println("Name:", person1.Name) // আউটপুট: Name: Alice
fmt.Println("Age:", person1.Age) // আউটপুট: Age: 25
fmt.Println("Height:", person1.Height) // আউটপুট: Height: 5.5
}এখানে, person1.Name, person1.Age, এবং person1.Height দিয়ে person1 struct এর ফিল্ডগুলো অ্যাক্সেস করা হয়েছে।
৩.২ Struct ফিল্ড পরিবর্তন
package main
import "fmt"
type Person struct {
Name string
Age int
Height float64
}
func main() {
person1 := Person{Name: "Alice", Age: 25, Height: 5.5}
// Struct ফিল্ড পরিবর্তন
person1.Age = 26
person1.Height = 5.6
fmt.Println(person1) // আউটপুট: {Alice 26 5.6}
}এখানে, person1.Age এবং person1.Height ফিল্ডগুলির মান পরিবর্তন করা হয়েছে।
৪. Struct পয়েন্টার (Pointers to Structs)
যেহেতু structs হলো বড় ডেটা স্ট্রাকচার, তাই এগুলোর পয়েন্টার ব্যবহার করা হয় যাতে মেমরি কম ব্যবহার করা যায়। Struct এর পয়েন্টার মাধ্যমে আমরা struct এর মানকে পরিবর্তন করতে পারি।
৪.১ Struct পয়েন্টার ব্যবহার
package main
import "fmt"
type Person struct {
Name string
Age int
Height float64
}
func main() {
person1 := &Person{Name: "Bob", Age: 30, Height: 6.0}
// Struct পয়েন্টার দিয়ে ফিল্ড অ্যাক্সেস এবং পরিবর্তন
fmt.Println("Before:", person1) // আউটপুট: &{Bob 30 6}
person1.Age = 31
person1.Height = 6.1
fmt.Println("After:", person1) // আউটপুট: &{Bob 31 6.1}
}এখানে, person1 একটি *Person টাইপ পয়েন্টার, এবং এটি Person struct এর পয়েন্টার হিসেবে কাজ করছে। ফিল্ডগুলি পরিবর্তন করা হয়েছে এবং এটি পয়েন্টার হিসেবে struct এর ডাটা ম্যানিপুলেট করেছে।
৫. Methods on Structs (Struct এর মেথডস)
Go তে, আপনি structs এর সাথে মেথড (functions) সংজ্ঞায়িত করতে পারেন, যা struct এর ডেটা ম্যানিপুলেট বা প্রসেস করতে ব্যবহৃত হয়।
৫.১ Struct Methods উদাহরণ
package main
import "fmt"
// Struct ডিক্লেয়ার করা
type Person struct {
Name string
Age int
Height float64
}
// Struct Method ডিফাইন করা
func (p *Person) birthday() {
p.Age += 1
fmt.Println("Happy Birthday", p.Name, "!")
}
func main() {
person1 := &Person{Name: "Charlie", Age: 40, Height: 5.8}
// Method কল করা
person1.birthday() // আউটপুট: Happy Birthday Charlie !
fmt.Println("New Age:", person1.Age) // আউটপুট: New Age: 41
}এখানে, birthday() একটি method যা Person struct এর পয়েন্টার হিসেবে ডিফাইন করা হয়েছে এবং এর মাধ্যমে Age ফিল্ডের মান পরিবর্তন করা হয়েছে।
৬. Anonymous Structs (নামহীন Structs)
Go তে আপনি Anonymous Structs তৈরি করতে পারেন, যা struct এর নাম ছাড়া ইনস্ট্যান্স তৈরি করা হয়।
৬.১ Anonymous Struct উদাহরণ
package main
import "fmt"
func main() {
// Anonymous struct তৈরি
person := struct {
Name string
Age int
Height float64
}{
Name: "John",
Age: 30,
Height: 5.9,
}
fmt.Println(person) // আউটপুট: {John 30 5.9}
}এখানে, person একটি নামহীন struct, যা সরাসরি ডিক্লেয়ার এবং ইনিশিয়ালাইজ করা হয়েছে।
সারসংক্ষেপ
- Struct: Go-তে struct একটি কাস্টম ডেটা টাইপ যা একাধিক ভিন্ন ধরনের ডেটাকে একত্রিত করে রাখে। এটি ডেটা গ্রুপিংয়ের জন্য ব্যবহৃত হয়।
- Struct Methods: Go তে struct এর সাথে মেথড সংজ্ঞায়িত করা যায়, যা struct এর ডেটা ম্যানিপুলেট করতে সহায়ক।
- Pointers to Structs: Go তে struct এর পয়েন্টার ব্যবহার করে আপনি struct এর মান পরিবর্তন করতে পারেন, যা মেমরি ব্যবস্থাপনায় দক্ষতা আনে।
- Anonymous Structs: আপনি নামহীন struct তৈরি করে তা একত্রিতভাবে ডেটা ধারণ করতে পারেন।
Go তে structs ব্যবহারের মাধ্যমে আপনি সম্পর্কিত ডেটাগুলিকে একটি কার্যকরী উপায়ে একত্রিত এবং ম্যানিপুলেট করতে পারবেন।
Go-তে Structs এর মাধ্যমে Custom Data Types তৈরি করা
Structs Go ভাষার একটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার, যা ডেভেলপারদের নিজস্ব কাস্টম ডেটা টাইপ তৈরি করতে সাহায্য করে। একটি struct হল এক ধরনের কাস্টম ডেটা টাইপ যা একাধিক ভিন্ন ধরনের ডেটাকে একত্রে ধারণ করে। Structs ব্যবহারের মাধ্যমে আপনি বিভিন্ন ধরনের ডেটা যুক্ত করে একটি সম্পূর্ণ ইউনিট তৈরি করতে পারেন।
১. Struct ডিফাইন করা
Go তে struct ডিফাইন করার জন্য type কীওয়ার্ড ব্যবহার করা হয়। Struct একটি ডেটা টাইপ যা একাধিক fields (ফিল্ড) ধারণ করে, এবং প্রতিটি ফিল্ডের একটি নির্দিষ্ট টাইপ থাকে।
১.১ Struct ডিফাইনেশন এবং ইনিশিয়ালাইজেশন
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
Height float64
}
func main() {
// Struct এর ইনস্ট্যান্স তৈরি
p1 := Person{
Name: "John Doe",
Age: 30,
Height: 5.9,
}
fmt.Println(p1)
}এখানে, Person একটি struct টাইপ যা তিনটি ফিল্ড ধারণ করে: Name (string), Age (int), এবং Height (float64)। p1 এর মাধ্যমে আমরা Person struct এর একটি ইনস্ট্যান্স তৈরি করেছি।
আউটপুট:
{John Doe 30 5.9}১.২ Struct ফিল্ড অ্যাক্সেস করা
Struct এর প্রতিটি ফিল্ডের মান অ্যাক্সেস করতে আপনি ডট (.) অপারেটর ব্যবহার করতে পারেন।
package main
import "fmt"
type Person struct {
Name string
Age int
Height float64
}
func main() {
p1 := Person{"Alice", 28, 5.5}
fmt.Println("Name:", p1.Name) // আউটপুট: Alice
fmt.Println("Age:", p1.Age) // আউটপুট: 28
fmt.Println("Height:", p1.Height) // আউটপুট: 5.5
}এখানে, p1.Name, p1.Age, এবং p1.Height এর মাধ্যমে আমরা Person struct এর ফিল্ড গুলির মান অ্যাক্সেস করেছি।
২. Struct এর মাধ্যমে Custom Data Types তৈরি করা
Go তে struct ব্যবহার করে আপনি একটি নতুন কাস্টম ডেটা টাইপ তৈরি করতে পারেন। এই কাস্টম টাইপটি আপনাকে আপনার প্রোগ্রামে বিভিন্ন ধরনের সম্পর্কিত ডেটা একত্রে সংগঠিত করতে সাহায্য করবে।
২.১ একাধিক Struct এর মাধ্যমে Custom Data Types
আপনি একাধিক struct তৈরি করতে পারেন এবং সেগুলির মধ্যে সম্পর্ক স্থাপন করতে পারেন। যেমন, একটি Address struct তৈরি করে, পরে সেটি Person struct এর মধ্যে ব্যবহার করতে পারেন।
package main
import "fmt"
// Address struct তৈরি
type Address struct {
Street string
City string
ZipCode int
}
// Person struct তৈরি
type Person struct {
Name string
Age int
Address Address // Address struct যুক্ত করা
}
func main() {
// Address struct এর ইনস্ট্যান্স তৈরি
address1 := Address{"123 Main St", "New York", 10001}
// Person struct এর ইনস্ট্যান্স তৈরি
person1 := Person{"John Doe", 30, address1}
fmt.Println("Name:", person1.Name)
fmt.Println("Age:", person1.Age)
fmt.Println("Address:", person1.Address.Street, person1.Address.City, person1.Address.ZipCode)
}এখানে, Person struct তে একটি Address struct অন্তর্ভুক্ত করা হয়েছে। এর মাধ্যমে, আমরা Person struct-এ Address struct এর মান অ্যাক্সেস করতে পারছি।
আউটপুট:
Name: John Doe
Age: 30
Address: 123 Main St New York 10001৩. Pointers এবং Structs
Struct এর পয়েন্টার ব্যবহার করা হয় যখন আপনি struct এর ইনস্ট্যান্সকে অন্য ফাংশনে পাস করতে চান, অথবা struct এর ডেটা পরিবর্তন করতে চান। Go-তে পয়েন্টার ব্যবহার করে struct এর ডেটাকে ম্যানিপুলেট করা খুব সহজ।
৩.১ Struct পয়েন্টার ব্যবহার
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
Height float64
}
// Struct পয়েন্টার পাস করা
func updateAge(p *Person) {
p.Age = 35 // struct এর Age ফিল্ড আপডেট করা
}
func main() {
p1 := Person{"Alice", 28, 5.5}
fmt.Println("Before update:", p1.Age) // আউটপুট: 28
// Struct পয়েন্টার ফাংশনে পাঠানো
updateAge(&p1)
fmt.Println("After update:", p1.Age) // আউটপুট: 35
}এখানে, updateAge ফাংশনটি Person struct এর পয়েন্টার নিয়েছে এবং তার Age ফিল্ডকে 35 এ আপডেট করেছে। &p1 এর মাধ্যমে আমরা p1 struct এর পয়েন্টার পাঠাচ্ছি।
আউটপুট:
Before update: 28
After update: 35৪. Methods on Structs
Go-তে আপনি struct টাইপের উপর মেথড (functions) ডিফাইন করতে পারেন। এটি struct এর উপর নির্দিষ্ট আচরণ বা কার্যকারিতা যুক্ত করতে সাহায্য করে।
৪.১ Struct Methods
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
}
// Method ডিফাইন করা
func (p *Person) Greet() {
fmt.Println("Hello, my name is", p.Name, "and I am", p.Age, "years old.")
}
func main() {
p1 := Person{"John", 30}
p1.Greet() // Method কল করা
}এখানে, Greet একটি method যা Person struct এর পয়েন্টার দিয়ে ডিফাইন করা হয়েছে। এই method-টি Person struct এর Name এবং Age ফিল্ড ব্যবহার করে একটি গ্রীটিং বার্তা প্রিন্ট করে।
আউটপুট:
Hello, my name is John and I am 30 years old.সারসংক্ষেপ
- Structs: Go-তে structs একটি কাস্টম ডেটা টাইপ তৈরি করতে ব্যবহৃত হয়, যা একাধিক ভিন্ন ধরনের ডেটা একত্রে ধারণ করতে সক্ষম।
- Pointers and Structs: Go-তে struct এর পয়েন্টার ব্যবহার করে আপনি struct এর ডেটা ম্যানিপুলেট এবং ফাংশনে পাস করতে পারেন।
- Methods on Structs: Go-তে struct এর উপর মেথড (functions) ডিফাইন করা যায় যা struct এর ফিল্ডস নিয়ে কাজ করে।
Go তে Structs এর মাধ্যমে আপনি শক্তিশালী কাস্টম ডেটা টাইপ তৈরি করতে পারবেন এবং সেগুলি বিভিন্ন ফাংশনে ব্যবহার করে প্রোগ্রামের কার্যকারিতা বাড়াতে পারবেন।
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 এর ব্যবহার আপনার কোডের কার্যকারিতা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক।
Go-তে Embedded Structs এবং Composition এর ব্যবহার
Go প্রোগ্রামিং ভাষায় Embedded Structs এবং Composition একটি শক্তিশালী কৌশল যা আপনাকে কোড পুনঃব্যবহারযোগ্য এবং আরও সংহত (modular) করতে সাহায্য করে। Go তে embedded structs ব্যবহার করে একটি struct এর মধ্যে অন্য struct অন্তর্ভুক্ত করা হয়, যা composition এর মাধ্যমে একাধিক struct এর ফিচার একত্রে ব্যবহার করতে সাহায্য করে।
১. Embedded Structs (এম্বেডেড স্ট্রাকচার)
Embedded Structs হল এমন একটি প্রক্রিয়া, যেখানে এক struct অন্য struct এর মধ্যে অন্তর্ভুক্ত থাকে (embed করা হয়)। এটি Go তে composition (গঠন) এর জন্য ব্যবহৃত হয়। এতে আপনি একটি struct-এর সমস্ত ফিল্ড এবং মেথড অন্য struct এ সহজে ব্যবহার করতে পারেন।
১.১ Embedded Structs উদাহরণ
ধরা যাক, আমাদের দুটি struct আছে: একটি Address struct এবং একটি Person struct, যেখানে Person struct এর মধ্যে Address struct অন্তর্ভুক্ত করা হয়েছে।
package main
import "fmt"
// Address struct
type Address struct {
Street, City, State string
ZipCode int
}
// Person struct with embedded Address
type Person struct {
Name string
Age int
Address // Embedded Address struct
}
func main() {
// Person struct এর একটি ইনস্ট্যান্স তৈরি
p := Person{
Name: "Alice",
Age: 30,
Address: Address{"123 Main St", "Somewhere", "CA", 90210},
}
// Embedded Address struct এর ফিল্ড অ্যাক্সেস করা
fmt.Println("Name:", p.Name)
fmt.Println("City:", p.City) // Address struct থেকে City ফিল্ড অ্যাক্সেস করা
fmt.Println("ZipCode:", p.ZipCode) // Address struct থেকে ZipCode ফিল্ড অ্যাক্সেস করা
}এখানে, Person struct-এর মধ্যে Address struct অন্তর্ভুক্ত করা হয়েছে (এম্বেডেড)। এর ফলে, Person struct তে Address struct-এর সব ফিল্ড অ্যাক্সেস করা সম্ভব।
আউটপুট:
Name: Alice
City: Somewhere
ZipCode: 90210১.২ Embedded Structs এর সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা: এক struct এর ফিচার অন্য struct-এ অন্তর্ভুক্ত করতে সাহায্য করে।
- সহজ কোড রিডেবিলিটি: স্ট্রাকচারগুলোকে সহজে একত্রে ব্যবহার করা যায়।
২. Composition (গঠন)
Composition হল এক struct এর মধ্যে অন্য struct কে অন্তর্ভুক্ত করার প্রক্রিয়া। Go-তে composition সাধারনত embedded structs এর মাধ্যমে করা হয়, যেখানে এক struct অন্য struct এর ফিল্ড এবং মেথডগুলিকে সরাসরি ব্যবহার করতে পারে।
২.১ Composition উদাহরণ
package main
import "fmt"
// Engine struct
type Engine struct {
Type string
Power int
}
// Car struct with Composition
type Car struct {
Model string
Engine // Embedding Engine struct into Car struct
}
func main() {
// Car struct এর একটি ইনস্ট্যান্স তৈরি
c := Car{
Model: "Tesla",
Engine: Engine{
Type: "Electric",
Power: 1024,
},
}
// Car struct এর Engine struct এর ফিল্ড অ্যাক্সেস করা
fmt.Println("Car Model:", c.Model)
fmt.Println("Engine Type:", c.Type) // Engine struct থেকে Type ফিল্ড অ্যাক্সেস করা
fmt.Println("Engine Power:", c.Power) // Engine struct থেকে Power ফিল্ড অ্যাক্সেস করা
}এখানে, Car struct এর মধ্যে Engine struct অন্তর্ভুক্ত করা হয়েছে (composition)। Car struct এর ইনস্ট্যান্সে Engine struct এর Type এবং Power ফিল্ড সরাসরি অ্যাক্সেস করা হয়েছে।
আউটপুট:
Car Model: Tesla
Engine Type: Electric
Engine Power: 1024২.২ Composition এর সুবিধা
- Flexible Design: Composition ব্যবহারের মাধ্যমে আপনি সহজেই বিভিন্ন ফিচার মিশিয়ে একটি নতুন struct তৈরি করতে পারেন।
- Encapsulation: Composition এর মাধ্যমে আপনি সহজে একাধিক struct এর ফিচার একত্রে নিয়ে কাজ করতে পারেন, এবং এগুলির অভ্যন্তরীণ কার্যকলাপ গোপন রাখতে পারেন।
৩. Methods with Embedded Structs
এম্বেডেড স্ট্রাকচার ব্যবহার করে, আপনি মেথডগুলোও struct-এ অন্তর্ভুক্ত করতে পারেন। যখন একটি struct অন্য struct এর মধ্যে অন্তর্ভুক্ত থাকে, তখন আপনি সেই struct এর মেথডগুলো সরাসরি কল করতে পারেন।
৩.১ Methods with Embedded Structs উদাহরণ
package main
import "fmt"
// Engine struct with a method
type Engine struct {
Type string
Power int
}
func (e Engine) Start() {
fmt.Println("Starting the", e.Type, "engine with", e.Power, "horsepower.")
}
// Car struct with embedded Engine
type Car struct {
Model string
Engine // Embedded Engine struct
}
func main() {
// Car struct এর একটি ইনস্ট্যান্স তৈরি
c := Car{
Model: "Tesla",
Engine: Engine{
Type: "Electric",
Power: 1024,
},
}
// Embedded Engine struct এর Start মেথড কল করা
fmt.Println("Car Model:", c.Model)
c.Start() // Engine এর Start মেথড কল করা
}এখানে, Engine struct-এ Start নামে একটি মেথড রয়েছে এবং এটি Car struct এর মধ্যে অন্তর্ভুক্ত। Car struct এর মাধ্যমে Engine struct এর Start মেথড কল করা হয়েছে।
আউটপুট:
Car Model: Tesla
Starting the Electric engine with 1024 horsepower.৪. Advantages of Embedded Structs and Composition
- Code Reusability: এক struct এর মেথড এবং ফিল্ড অন্য struct-এ সহজেই অন্তর্ভুক্ত করা যায়, ফলে কোড পুনঃব্যবহারযোগ্য হয়।
- Flexibility: Composition ব্যবহার করে আপনি সহজেই একাধিক struct-এর বৈশিষ্ট্য মিশিয়ে নতুন একটি struct তৈরি করতে পারেন।
- Encapsulation: Struct এর মধ্যে অন্য struct অন্তর্ভুক্ত করলে, আপনি কমপ্লেক্স ডেটা টাইপগুলোকে একত্রে এবং সহজে ম্যানেজ করতে পারেন।
সারসংক্ষেপ
- Embedded Structs: Go তে, embedded structs হল একটি struct যা অন্য struct এর মধ্যে অন্তর্ভুক্ত থাকে, যা কোড পুনঃব্যবহারযোগ্যতার সুবিধা প্রদান করে।
- Composition: Composition হল একটি কাঠামো যেখানে এক struct অন্য struct এর মধ্যে অন্তর্ভুক্ত থাকে এবং এর সব ফিচার ও মেথড সরাসরি অ্যাক্সেস করা যায়।
- Methods with Embedded Structs: এক struct এর মধ্যে অন্য struct এর মেথডও অন্তর্ভুক্ত করা যায়, যাতে এটি সহজে ব্যবহার করা যায়।
এগুলো composition এবং embedded structs ব্যবহার করে কোডের মডুলারিটি, পুনঃব্যবহারযোগ্যতা, এবং সুষ্ঠু গঠন নিশ্চিত করতে সহায়ক।
Read more