Structs এবং Methods (স্ট্রাক্ট এবং মেথড)

গো প্রোগ্রামিং (Go Programming) - Computer Programming

298

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 এর মাধ্যমে আপনি একটি শক্তিশালী এবং সংগঠিত কোডবেস তৈরি করতে পারেন, যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের ধারণা অনুসরণ করে।

Content added By

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 ব্যবহারের মাধ্যমে আপনি সম্পর্কিত ডেটাগুলিকে একটি কার্যকরী উপায়ে একত্রিত এবং ম্যানিপুলেট করতে পারবেন।

Content added By

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 এর মাধ্যমে আপনি শক্তিশালী কাস্টম ডেটা টাইপ তৈরি করতে পারবেন এবং সেগুলি বিভিন্ন ফাংশনে ব্যবহার করে প্রোগ্রামের কার্যকারিতা বাড়াতে পারবেন।

Content added By

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 এর ব্যবহার আপনার কোডের কার্যকারিতা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক।

Content added By

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 ব্যবহার করে কোডের মডুলারিটি, পুনঃব্যবহারযোগ্যতা, এবং সুষ্ঠু গঠন নিশ্চিত করতে সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...