ما از کانالها برای اجرایی کردن هماهنگ سازی ها در سرتا سر goroutineها استفاده میکنیم. اینجا یک مثال از استفاده اونها رو داریم که یک دریافت به حالت بلاک شده تا پایان کار یک goroutine صبر میکند.
package main import "fmt" import "time"
این تابعی است که در یک goroutine اجرا میشود. کانال done
برای اعلان کردن goroutine دیگری استفاده میشود و این مفهوم را میرساند که این تابع کارش را به اتمام رسانده است.
func worker(done chan bool) { fmt.Print("working...") time.Sleep(time.Second) fmt.Println("done")
ارسال یک مقدار برای اینکه نشان دهیم ما این کار را انجام داده ایم.
done <- true } func main() {
یک goroutine به نام worker آغاز میشود, که یک اعلان روی آن پیاده شده است.
done := make(chan bool, 1) go worker(done)
تا زمانی که ما یک اعلان را از سمت worker که رو channelهست دریافت کنیم برنامه مسدود است.
<-done }
$ go run channel-synchronization.go working...done
اگر شما خط done->
را از این برنامه پاک کنید, برنامه قبل از این که رویداد worker
شروع شود تمام خواهد شد.
<<بافر کردن کانال---------------------------------- هدایت کانال>>