Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ক্লাস ২৭: Go স্ট্রাক্ট এবং মেমোরি বিন্যাস 🧱

এই ক্লাসে আমরা স্ট্রাক্ট কীভাবে ডিফাইন ও ইন্সট্যানশিয়েট করতে হয়, এবং এগুলো কীভাবে Go এর মেমোরি মডেলের সাথে কাজ করে তা শিখব। 🧠💡


✍️ ক্লাস ২৭ এর কোড:

package main

import "fmt"

type User struct {
	Name string
	Age  int
}

func (usr User) printDetails() {
	fmt.Println("Name:", usr.Name)
	fmt.Println("Age:", usr.Age)
}

func main() {
	user1 := User{
		Name: "Ruhin",
		Age:  21,
	}

	user2 := User{
		Name: "Mukim",
		Age:  15,
	}

	user1.printDetails()
	user2.printDetails()
}

🧠 মূল ধারণা

🧩 স্ট্রাক্ট (Struct) কী?

Go তে স্ট্রাক্ট হলো একটি ইউজার ডিফাইন্ড টাইপ(user-defined type), যা ব্যবহারকারী নিজের মতো করে তৈরি করতে পারে, যাতে সম্পর্কিত ডেটা একসাথে রাখা যায়। এটি মূলত বিভিন্ন ফিল্ডের জন্য একটি কাস্টম কন্টেইনার।

type User struct {
	Name string
	Age  int
}

এটি User নামে একটি নতুন টাইপ ডিফাইন করে, যার ফিল্ড হলো Name এবং Age


🔨 ইনস্ট্যান্স তৈরি (Instantiation)

যখন আমরা স্ট্রাক্ট টাইপ ব্যবহার করে একটি আসল মান তৈরি করি, সেটাই ইনস্ট্যান্সিয়েশন (Instantiation).।

user1 := User{
	Name: "Ruhin",
	Age:  21,
}

এখানে user1 হলো User টাইপের একটি ইনস্ট্যান্স। এটি Name এবং Age মানগুলো রাখার জন্য মেমোরি অ্যালোকেট করে।


🧠 মেমোরি লেআউট (ভিজ্যুয়ালাইজেশন)

┌─────────────────────────────┐
│       কোড সেগমেন্ট         │
│-----------------------------│
│ main, printDetails,         │
│ type User struct {...}      │
└─────────────────────────────┘
          ↓
┌─────────────────────────────┐
│       ডেটা সেগমেন্ট         │
│-----------------------------│
│ -                           │
│(গ্লোবাল ভেরিয়েবল থাকলে)    │
└─────────────────────────────┘
          ↓
┌─────────────────────────────┐
│           স্ট্যাক             │
│-----------------------------│
│ main() frame →              │
│   user1 → Name: "Ruhin"     │
│           Age: 21           │
│   user2 → Name: "Mukim"     │
│           Age: 15           │
└─────────────────────────────┘

⚠️ NOTE: If a struct is returned from a function or captured by a closure, it may escape to the heap instead of stack. ⚠️ নোট: যদি কোনো স্ট্রাক্ট ফাংশন থেকে রিটার্ন হয় বা ক্লোজারে ব্যবহার হয়, তাহলে এটি স্ট্যাকের বদলে হিপে স্থানান্তরিত হতে পারে।


📋 উদাহরণ

type Book struct {
	Title  string
	Author string
	Pages  int
}

book1 := Book{
	Title: "1984",
	Author: "George Orwell",
	Pages: 328,
}

এভাবে আমরা একাধিক তথ্য নিয়ে বাস্তব জীবনের মতো মডেল তৈরি করতে পারি।


🧹 গারবেজ কালেক্টরের ভূমিকা

  • যদি কোনো স্ট্রাক্ট ইনস্ট্যান্স এস্কেপ করে (ফাংশনের বাইরে ব্যবহার হয়, দীর্ঘ সময় ধরে রাখা হয়), তাহলে Go সেটি হিপে রাখে।
  • Go এর গারবেজ কালেক্টর তখন সেটি ট্র্যাক করে আর ব্যবহার না হলে মেমোরি ফাঁকা করে দেয়।
  • তাই ম্যানুয়ালি free() করার দরকার নেই, Go নিজেই হিপের মেমোরি পরিচ্ছন্ন করে।

🚀 সংক্ষেপে

  • type User struct {...} হলো টাইপের তথ্য → কোড সেগমেন্ট-এ থাকে।
  • user1 := User{...} হলো রানটাইম ডেটা → স্ট্যাক বা হিপের রাখা হয় ব্যবহার অনুযায়ী।
  • স্ট্রাক্ট একসাথে অনেক ফিল্ডকে একটি লজিক্যাল ইউনিটে গুছিয়ে রাখে ✅
  • মেমোরি লেআউট ব্যবহার অনুসারে বদলায় → এস্কেপ অ্যানালাইসিসের সিদ্ধান্ত অনুসারে 📦🧳
  • গারবেজ কালেক্টর শুধু হিপের মেমোরি পরিষ্কার করে, স্ট্যাক নয় 🧹

প্রশ্ন: স্ট্রাক্ট কি একটি ডেটাটাইপ?

উত্তর: হ্যাঁ, ১০০% — Go-তে স্ট্রাক্ট হলো ব্যবহারকারীর তৈরি একটি ডেটাটাইপ। এটা এমন একটা "ব্লুপ্রিন্ট" যেটা দিয়ে তুমি নিজের মতো করে ডেটা অবজেক্ট বানাতে পারো। 💡

কিভাবে:

-[] Go তে int, string, bool ইত্যাদির মতো প্রিমিটিভ ডেটা টাইপ থাকে। -[] তুমি struct ব্যবহার করে নিজের কাস্টম টাইপ তৈরি করতে পারো, যাতে একাধিক ফিল্ড একসাথে থাকে।

যেমন:

type User struct {
	Name string
	Age  int
}

এখন User নিজেই একটা ডেটাটাইপ এর মতো কাজ করবে, আর তুমি এর ইনস্ট্যান্স তৈরি করে কাজ করতে পারো ঠিক int বা string এর মতো:

var u User
u.Name = "Ruhin"
u.Age = 21

এটা এমন যেন তুমি নিজের মতো একটা লেগো ব্রিক তৈরি করছো, আর যত খুশি কপি বানাতে পারো। 🧱✨

তোমার Go প্রোগ্রাম এখন স্ট্রাকচার্ড! 😎 পরের বার ডেটা মডেল করলে নিজের টাইপ তৈরি করো আর মেমোরি সেগমেন্ট বুঝে কাজ করো!

[Author: @ifrunruhin12, @nazma98 Date: 2025-05-01 - 2025-05-17 Category: interview-qa/class-wise ]