اگه بخوای چند تا کارو همزمان تو Go انجام بدی، دو تا ابزار جادویی داری: goroutine و channel. اینا کمک میکنن کدت سریعتر، سبکتر و هوشمندتر بشه 😎
🚀 گوروتین چیه؟
گوروتین (goroutine) یه نخ سبکه که Go خودش مدیریت میکنه. کافیه قبل از یه تابع go بذاری تا همزمان با بقیهی برنامه اجرا بشه:
go sayHello()
🧠 یعنی چی؟
یعنی اون تابع اجرا میشه ولی برنامه منتظر نمیمونه که تموم شه. اینجوری کلی کارو باهم میتونی انجام بدی!
📡 کانال چیه؟
کانال (channel) یه راه ارتباطیه بین گوروتینها. باهاش میتونی داده بفرستی و بگیری، بدون این که نگرانی race condition داشته باشی 💬
مثلاً:
ch := make(chan string)
go func() {
ch <- "سلام از گوروتین"
}()
msg := <-ch
fmt.Println(msg)
📤 اینجا یه گوروتین پیام میفرسته، و گوروتین اصلی میگیره.
✨ کاربردهای خفن کانال و گوروتین
✅ اجرای همزمان چند عملیات
✅ سینککردن دیتا بین توابع
✅ ساخت برنامههای سریع، تمیز و بدون بنبست
✅ حذف نیاز به lock تو خیلی از موارد
🔀 کانال یکطرفه
بعضی وقتا دوست داری فقط ارسال یا فقط دریافت داشته باشی. اون موقع میتونی کانال یکطرفه بسازی:
func sendData(ch chan<- int) {
ch <- 42
}
func receiveData(ch <-chan int) {
fmt.Println(<-ch)
}🔒 اینجوری Go تضمین میکنه که اشتباهی با کانال برخورد نکنی.
📦 کانالهای بافردار
بهصورت پیشفرض، کانالها بیواسطه هستن (بدون بافر). ولی میتونی با make(chan T, n) یه کانال با ظرفیت n بسازی:
ch := make(chan int, 2)
ch <- 1
ch <- 2
⏸️ اینجوری تا زمانی که ظرفیت پر نشده، ارسالکننده بلاک نمیشه.
⚠️ نکات مهم
🚧 یادت نره کانالی که دیگه لازم نداری رو ببندی: close(ch)
☠️ اگه یه کانال ساخته باشی ولی کسی ازش دریافت نکنه یا نفرست، برنامه قفل میکنه (deadlock)
🐘 ساختن بیرویهی goroutine ممکنه حافظه رو بخوره، حواست باشه!
🧹 جمعبندی آخر
کانال و گوروتین مثل جاروبرقی و سیمبرقان تو Go باهم کار میکنن و بدون هم نمیتونن! با استفادهی درست از اینا، میتونی برنامههایی بنویسی که سریع، سبک و بدون دردسر باشن 💪
☕️Telegram | Website | Discord