Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Bu örnekte, "tamponlu" kanallarla (channel) bir "ping/pong" oyunu oluşturacağız. Topa her saniye sonsuz bir şekilde ping atmak ve pong atmak için ayrılmış iki goroutines olacaktır. Kanallar goroutinler arasında iletişim için kullanılır. Burada iki goroutine topa vurduklarında diğerini bilgilendirir.


Örnek 1


package main

import (
"fmt"
"time"
)

func main() {
ping := make(chan struct{}, 1)
pong := make(chan struct{}, 1)

ping<- struct{}{}

go play(ping, pong)

time.Sleep(time.Millisecond)
}

func play(ping, pong chan struct{}) {
for {
select {
case <-ping:
fmt.Println("ping")
pong<- struct{}{}
case <-pong:
fmt.Println(" pong")
ping<- struct{}{}
}
}
}

Örnek 2


package main

import (
"fmt"
"time"
)

func main() {
pingChan := make(chan int, 1)
pongChan := make(chan int, 1)

go ping(pingChan, pongChan)
go pong(pongChan, pingChan)

pingChan <- 1

select {}
}

func ping(pingChan <-chan int, pongChan chan<- int) {
for {
ball := <-pingChan

fmt.Println("Ping", ball)
time.Sleep(1 * time.Second)

pongChan <- ball+1
}
}

func pong(pongChan <-chan int, pingChan chan<- int) {
for {
ball := <-pongChan

fmt.Println("Pong", ball)
time.Sleep(1 * time.Second)

pingChan <- ball+1
}
}

Test


Ping 1
Pong 2
Ping 3
Pong 4
Ping 5
Pong 6
Ping 7
Pong 8
Ping 9
Pong 10
Ping 11
Pong 12
...
...
...