Channel

Channel kelimesinin Türkçe karşılığı 'kanal'dır. string değer döndüren bir fonksiyonda değeri ne ile döndürüyorduk? Elbette, return kullanıyorduk. Peki, eş zamanlılık yani concurrency kullanırken bunlar haberleşebilecek mi? Bakalım.

Çalışmadı, hata aldık. İşte, bu yüzden Go, Channel kavramını çıkarmıştır. go routine'lerin birbirleriyle haberleşebilmesi adına bu yapıları kullanıyoruz. Nasıl yapıldığına bir bakalım.

Önce bir fonksiyon tanımlıyoruz ama bu fonksiyonun parametresi biraz değişik. Parametre olarak kullanacağımız bir değişken ismi (channel) gerekiyor. Daha sonra bunun bir channel yani kanal olduğunu belirtmek için de 'chan' yazıyoruz ve son olarak veri tipini belirliyoruz; artık fonksiyonunuz hangi tipte veri dönecekse ona göre ayarlarsınız; ben string yaptım. Daha sonra fonksiyonun içine return yazmak yerine channel <- "Cyber Worm" şeklinde bir ifade veriyoruz. Bunun adı 'ok operatörü'dür. Bunu yaparak aslında biz, string olan değerimizi channel'a aktarmış oluyoruz.

Bunları yaptıktan sonra main() içerisine geliyoruz. Burada, bir kanal tanımlamak zorundayız. Bu tanımlamayı da 'MyChannel := make(chan string)' şeklinde yapıyoruz. Buradaki 'make' bir fonksiyondur ve anlamı 'yap'tır. Bu fonksiyonu verdikten sonra içerisine, bunun bir kanal olduğunu belirten parametremizi (chan) ve veri tipimizi (string) yazıyoruz. Artık 'MyChannel' adında bir kanalımız var.

Kanalı tanımladıktan sonra aşağı bir rutin oluşturuyoruz ama bunu normal şekilde (go cyberworm()) tanımlamak yerine, içerisine kanalımızın referansını veriyoruz. Az önce cyberworm() fonksiyonunu bir kanal olarak tanımladık. Aynı zamanda main() içerisine de bir kanal tanımladık. İşte, bu iki kanalın haberleşebilmesi için birbirine referans olması yani birbirlerini görmesi gerekir. Bunu da 'go cyberworm(MyChannel)' şeklinde yaparız. Bunun Türkçe anlamı şu şekilde olabilir: "cyberworm fonksiyonundaki kanal ile MyChannel kanalını birleştirip haberleşmelerini sağla ve bunu bir rutin olarak ayarla."

Son olarak cyberworm kanalındaki veriyi alabilmemiz için bunu yazdırmamız gerekiyor fakat return kullanmadığımızı unutmayın yani normal bir yazdırma işlemi olmayacak. Bunun için yine ok operatörü kullanacağız. 'fmt.Println(<-MyChannel)' şeklinde yazdığımız zaman yazdırma işlemi başarılı bir şekilde gerçekleşecektir.

Şimdi, kodun bütününü ve çıktısını görelim.


Yayınlanma Tarihi: 2022-08-18 23:52:16

Son Düzenleme Tarihi: 2022-08-20 22:29:54