Header Ads

Header ADS

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

মানে:

  1. Channel একসাথে ২টা value জমা রাখতে পারবে

  2. ৩য় 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. শুধু 12 পড়েছে

  2. 34 buffer-এ পড়ে রয়ে গেছে

  3. program শেষ হয়ে গেছে


🎯 Final Truth

👉 magic ৪টা পাঠাতে পেরেছে কারণ buffered channel-এ ২টা slot ছিল + receiver মাঝে মাঝে খালি করেছে

👉 magic একসাথে ৪টা পাঠায়নি, বরং:

  1. ২টা পাঠিয়েছে

  2. block হয়েছে

  3. receiver পড়েছে

  4. আবার পাঠিয়েছে


🧠 Real-Life Analogy

Channel = Basket (capacity 2)

magic = Person putting apples

fun = Person taking apples

  1. Basket এ ২টা আপেল রাখা যাবে

  2. Basket ভরে গেলে রাখবে না

  3. কেউ একটা নিলে আবার জায়গা হবে



Powered by Blogger.