Buffered Channel Concept (With code example)
func magic (ch chan int){
for i:=1 ; i<=4 ; i++ {
fmt.Println("Sending - ",i)
ch <- i
fmt.Println("Sent - ",i)
}
}
func fun (ch chan int){
for i:=1 ; i<=2 ; i++{
v := <-ch
fmt.Println("the value of v : ",v)
}
}
func main (){
ch := make(chan int,2)
go magic(ch)
go fun(ch)
time.Sleep(4 * time.Second)
}
ch := make(chan int, 2)
মানে 👉 buffer size = 2
🔁 তোমার কোডে কে Sender আর কে Receiver?
✅ Sender = magic()
কারণ এটি data পাঠাচ্ছে:
ch <- i
✅ Receiver = fun()
কারণ এটি data নিচ্ছে:
v := <-ch
❓ এখন প্রশ্ন:
"fun শুধু 2টা value নিচ্ছে, তাহলে magic কীভাবে 4টা পাঠাতে পারছে?"
চল step-by-step দেখি।
🧠 Buffered Channel Capacity = 2
মানে:
Channel একসাথে ২টা value জমা রাখতে পারবে
৩য় value পাঠাতে গেলে sender block হবে যতক্ষণ না receiver কিছু পড়ে
🧩 Timeline (Step by Step Execution)
magic শুরু করলো:
i = 1
Sending 1
buffer = [1]
Sent 1 ✅ (buffer not full)
i = 2
Sending 2
buffer = [1, 2]
Sent 2 ✅ (buffer full now)
i = 3
Sending 3
buffer FULL ❌ → magic BLOCKED (wait)
🧠 এখন fun() কাজ শুরু করে
fun reads first value
v = 1
buffer = [2]
👉 buffer-এ জায়গা খালি হলো
👉 magic আবার চলতে পারে
magic resumes
Sent 3
buffer = [2, 3]
fun reads second value
v = 2
buffer = [3]
magic sends i = 4
Sending 4
buffer = [3, 4]
Sent 4
⚠️ কিন্তু fun শুধু 2টা value নেয়:
for i := 1; i <= 2; i++ {
v := <-ch
}
মানে:
শুধু
1ও2পড়েছে3ও4buffer-এ পড়ে রয়ে গেছেprogram শেষ হয়ে গেছে
🎯 Final Truth
👉 magic ৪টা পাঠাতে পেরেছে কারণ buffered channel-এ ২টা slot ছিল + receiver মাঝে মাঝে খালি করেছে
👉 magic একসাথে ৪টা পাঠায়নি, বরং:
২টা পাঠিয়েছে
block হয়েছে
receiver পড়েছে
আবার পাঠিয়েছে
🧠 Real-Life Analogy
Channel = Basket (capacity 2)
magic = Person putting apples
fun = Person taking apples
Basket এ ২টা আপেল রাখা যাবে
Basket ভরে গেলে রাখবে না
কেউ একটা নিলে আবার জায়গা হবে