Go by Example မြန်မာဘာသာ: 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 နည်းလမ်းတွေ သုံးစရာမလိုပဲနဲ့ စောင့်ဆိုင်းနိုင်စေပါတယ်။

နောက်ဥပမာ: Channel Buffering.