Go by Example: Channels

Kanallar — bu parallel goroutinalarni bir-biriga bog’laydigan quvurlardir. Bir goroutinadan kanallarga qiymat jo’natib, o’sha qiymatlarni boshqa goroutinada qabul qilishingiz mumkin.

package main
import "fmt"
func main() {

make(chan val-type) bilan yangi kanal yarating. Kanallar o’zlari uzatadigan qiymatlar tipiga ega bo’ladi.

    messages := make(chan string)

channel <- sintaksisi yordamida kanalga qiymat jo’nating. Bu yerda biz yuqorida yaratgan messages kanaliga yangi goroutinadan "ping"ni jo’natamiz.

    go func() { messages <- "ping" }()

<-channel sintaksisi kanaldan qiymatni qabul qiladi. Bu yerda biz yuqorida jo’natgan "ping" xabarini qabul qilib, uni chop etamiz.

    msg := <-messages
    fmt.Println(msg)
}

Dasturni ishga tushirganimizda "ping" xabari kanalimiz orqali bir goroutinadan boshqasiga muvaffaqiyatli uzatiladi.

$ go run channels.go 
ping

Standart holatda jo’natish va qabul qilish ham jo’natuvchi, ham qabul qiluvchi tayyor bo’lguncha bloklanadi. Ushbu xususiyat bizga dasturimiz oxirida boshqa hech qanday sinxronizatsiyadan foydalanmasdan "ping" xabarini kutish imkonini berdi.

Keyingi misol: .