GUI (Grafiksel Kullanıcı Arayüzü)
Kanallar (Channels)
Kanallar, Go dilinde asenkron programlama yaparken değer aktarımı yapabileceğimiz hatlardır. Kanala değer atanması iş parçacığı tarafından bekleneceği için asenkron işlemler arasındaki senkronizasyonu ayarlayabiliriz. Kanallar make() fonksiyonu ile oluşturulur.
Örnek
1
k := make(chan bool)
Copied!
Yukarıdaki örnekte make() fonksiyonu ile k isminde bir kanal oluşturduk. Bu kanalın özelliği bool tipinde değer taşımasıdır. Yani bu kanal ile true veya false değerlerini taşıyabiliriz. Kanala değer göndermek için <- işaretini kullanırız. Yani bir nevi atama işlemi yapıyoruz. Atama işleminden farkı, kanala atama işlemi yapılana kadar iş parçacığının devam etmemesidir.
Örnek Atama
1
k <- true
Copied!
Atama işlemi ile kanalımıza değer yolladık. Bir de bu kanalın çıkış noktası olması gerekir. Bu çıkış noktasında, ister kanaldan gelen veriyi bir değişkene atayabiliriz, istersek de sadece kanala veri gelmesini bekleyebiliriz.
Kanaldan gelen değeri değişkene atama
1
a := <-k
Copied!
Yukarıdaki örnekte a isimli değişkene k kanalından gelen bool tipinde değer atadık. a değişkenine atama işlemi k kanalına değer gönderildiği zaman yapılacaktır. Yani k kanalına değer gelene kadar iş parçacığı duraklatılacaktır. (Program k kanalına gelecek değeri bekler.)
Sadece kanala değer gelmesini beklemek
1
<- k
Copied!
Yukarıdaki anlatılanlardan yola çıkarak bir örnek oluşturalım.
Örnek kanal işlemleri
1
package main
2
3
import (
4
"time"
5
)
6
7
func main() {
8
9
//bir kanal oluşturalım
10
k := make(chan bool)
11
//bu kanalımız bool değer taşıyacak
12
13
//asenkron bir iş parçacığı oluşturalım
14
go func() {
15
16
//bu iş parçacığı 5 sn beklesin
17
time.Sleep(time.Second * 5)
18
19
//k kanalına bool bir değer gönderelim
20
k <- true
21
}()
22
23
//ana iş parçacığı k kanalına değer gelene kadar bekleyecek
24
<-k
25
//değer geldiğinde program sonlanacaktır.
26
}
Copied!

Boyutlu Kanal Oluşturma

Oluşturduğumuz kanala boyut vermek de mümkün. Yani kanalımıza birden fazla değer yollayabiliyoruz. Bunun için kanalı oluştururken make() fonksiyonunda boyutu da belirtelim.
Örnek
1
package main
2
3
import (
4
"fmt"
5
"time"
6
)
7
8
func main() {
9
10
//2 adet bool değer taşıyan bir kanal oluşturalım
11
k := make(chan bool, 2)
12
13
14
//asenkron bir iş parçacığı oluşturalım
15
go func() {
16
17
//5 sn beklesin
18
time.Sleep(time.Second * 5)
19
20
//k kanalına bool bir değer gönderelim
21
k <- true
22
23
//tekrardan 2 sn beklesin
24
time.Sleep(time.Second * 2)
25
26
//ve k kanalına 2. değer de gönderilsin.
27
k <- false
28
}()
29
30
//ana iş parçacığı k kanalına 2 değer gelene kadar bekleyecek
31
fmt.Println(<-k, <-k) //çıktı: true false
32
//iki bool değeri de baştırmak için k kanalını 2 defa yazdık
33
}
Copied!
Ana iş parçacığı (main() içerisine yazılan kodlar) devam etmek için k kanalına gelen 2 değeri de bekleyecektir.
fmt.Println() içerisine sadece bir defa <-k yazsaydık, k kanalına ilk gelen değeri ekrana bastıracaktı.
Last modified 1yr ago
Copy link