💡 ইন্টারভিউ প্রশ্ন: Go-তে variable shadowing
🧪 Code Example :
package main
import "fmt"
var a = 10
func main() {
age := 30
if age > 18 {
a := 47 // শুধু এই if ব্লকের ভিতরে গ্লোবাল `a` কে shadow করে
fmt.Println(a) // ➜ 47
}
fmt.Println(a) // ➜ 10 (গ্লোবাল `a` প্রিন্ট করে)
}
📌 গুরুত্বপূর্ণ বিষয়:
- ভেরিয়েবল শ্যাডোয়িং হয় যখন লোকাল ভেরিয়েবলের নাম বাইরের স্কোপের ভেরিয়েবলের নামের সঙ্গে মিলে যায়।
- Go কোন Error দিবে না এটি শুধুমাত্র বর্তমান স্কোপে থাকা সবচেয়ে ভিতরের ভেরিয়েবলটি ব্যবহার করবে।
- Global
a
অপরিবর্তিত থাকে এবং if ব্লকের বাইরে প্রিন্ট হয়।
🧠 Memory ও stack animation
⏱ প্রোগ্রাম শুরু
📦 Data segment:
┌─────────────┐
│ global a=10 │ ◄── প্রোগ্রাম শেষ হওয়া পর্যন্ত থাকে
└─────────────┘
🚀 main() কল হয়
📚 Stack:
┌────────────────────────────┐
│ 🧩 main() stack frame │
│ └── age = 30 │
└────────────────────────────┘
✅ if ব্লকে প্রবেশ (কারণ age > 18 সত্য)
🧱 নতুন ব্লক স্কোপ শুরু
📚 Stack:
┌────────────────────────────┐
│ 🧩 main() stack frame │
│ └── age = 30 │
│ 🔸 a (shadow করা) = 47 | ◄── global `a` কে shadow করে
└────────────────────────────┘
🖨️ fmt.Println(a) ➜ output: 47 ✅
🔚 if ব্লক শেষ, shadow করা a
ডিলিট হয়
📚 Stack:
┌────────────────────────────┐
│ 🧩 main() stack frame │
│ └── age = 30 │
└────────────────────────────┘
🖨️ fmt.Println(a) ➜ output: 10 ✅ (global a
)
🔚 main() শেষ, stack clear
📚 Stack:
(empty)
🧼 প্রোগ্রাম শেষ
📌 ভিজ্যুয়াল সারাংশ
- গ্লোবাল variable (যেমন
a = 10
) ডাটা সেগমেন্টে থাকে। - লোকাল variable (যেমন
age
বা shadow করেa
) স্ট্যাকে থাকে। - নতুন scope (যেমন if, for, function block) এ ঢুকলে নতুন variable স্ট্যাকে পুশ হয়।
- ব্লক শেষ হলে shadow করা variable স্ট্যাক থেকে মুছে যায়।
- প্রোগ্রাম শেষ হলে স্ট্যাক ক্লিয়ার হয়, কিন্তু ডাটা সেগমেন্ট পুরো সময় জীবিত থাকে।
[Author: @ifrunruhin12 @shahriar-em0n Date: 2025-05-01 Category: interview-qa/class-wise ]