Channels

Channels #

// _Channel_ တွေဆိုတာ concurrent ဖြစ်နေတဲ့ goroutine တွေကို ဆက်သွယ်ပေးတဲ့ ပိုက်လိုင်းတွေပါ။
// goroutine တစ်ခုကနေ channel ထဲကို တန်ဖိုးတွေ ပို့နိုင်ပြီး
// နောက် goroutine တစ်ခုကနေ အဲဒီတန်ဖိုးတွေကို လက်ခံယူနိုင်ပါတယ်။
package main

import "fmt"

func main() {

	// `make(chan val-type)` နဲ့ channel အသစ်တစ်ခု ဖန်တီးပါတယ်။
	// Channel တွေက သူတို့သယ်ဆောင်တဲ့ တန်ဖိုးတွေရဲ့ type အလိုက် type သတ်မှတ်ချက်ရှိပါတယ်။
	messages := make(chan string)

	// `channel <-` syntax ကိုသုံးပြီး channel ထဲကို တန်ဖိုးတစ်ခု _ပို့_ ပါတယ်။
	// ဒီမှာ အပေါ်မှာဖန်တီးထားတဲ့ `messages` channel ထဲကို `"ping"` ဆိုတဲ့စကားလုံးကို
	// goroutine အသစ်တစ်ခုကနေ ပို့လိုက်ပါတယ်။
	go func() { messages <- "ping" }()

	// `<-channel` syntax က channel ကနေ တန်ဖိုးတစ်ခုကို _လက်ခံယူ(receive)_ ပါတယ်။
	// ဒီမှာ အပေါ်မှာပို့လိုက်တဲ့ `"ping"` message ကို လက်ခံယူပြီး print ထုတ်ပါမယ်။
	msg := <-messages
	fmt.Println(msg)
}
# ပရိုဂရမ်ကို run လိုက်တဲ့အခါ `"ping"` message က 
# ကျွန်တော်တို့ channel ကနေတဆင့် goroutine
#  တစ်ခုကနေ နောက်တစ်ခုဆီကို 
# အောင်မြင်စွာ ပို့ဆောင်ခဲ့ပါတယ်။
$ go run channels.go 
ping

# ပုံမှန်အားဖြင့် ပို့တာနှင့်လက်ခံတာက 
# ပို့သူနဲ့လက်ခံသူ နှစ်ဦးစလုံး အဆင်သင့်ဖြစ်တဲ့အထိ 
# block လုပ်ထားပါတယ်။
# ဒီ property က ကျွန်တော်တို့ ပရိုဂရမ်အဆုံးမှာ 
# `"ping"` message အတွက်၊
# တခြား synchronization နည်းလမ်းတွေ 
# သုံးစရာမလိုပဲနဲ့ စောင့်ဆိုင်းနိုင်စေပါတယ်။