Go, Google tarafından geliştirilen açık kaynaklı bir programlama dilidir. Google, Meta, Microsoft, Netflix gibi büyük teknoloji şirketleri Go diline adapte olmuşlar ve ürünlerini bu dil ile geliştirmişlerdir. Günümüzüde özellikle bulut altyapıları ve ağ sistemleri, web uygulamaları, komut satırı arayüzleri (CLI – command line interface) ve DevOps uygulamalarında tercih edilmekte ve giderek yaygınlaşmaktadır.
Go Dilinin Özellikleri:
- Sentaks kuralları açısından oldukça sade fakat yeterli ve etkili bir dildir. Öğrenmesi ve adapte olunması oldukça kolaydır.
- Statik bir şekilde derlenen bir dildir. Farklı platform ve işletim sistemleri için derleme yapılabilir ve bu çıktılar tek başlarına dağıtılabilir.
- Oldukça geniş ve güçlü bir standart kütüphane sunmaktadır. Çoğu uygulama için standart kütüphane yeterli olmaktadır.
- Doğrudan dilin kurallarına entegre edilmiş bir eş zamanlı programlama (concurrency) modeli sunmaktadır.
- Paket yükleyici, test sistemi, Language Server Protocol (LSP), formatlayıcı (formatter) gibi oldukça kullanıcı geliştirici araçları bulunmaktadır.
- Oldukça geniş ve gittikçe büyüyen bir ekosisteme sahiptir.
- Çöp toplayıcı (garbage collector) mekanizması bulundurmaktadır. Böylece hafıza yönetimi otomatik olarak yapılır.
Go Kurulumu
Windows ve MacOS için hazır yükleyiciler bulunmaktadır. Linux sistemler içinse tek bir komutla veya paket yöneticiniz üzerinden kurulum yapabilirsiniz. Kurulum hakkında detaylı yönergeleri go web sitesinden takip edebilirsiniz.
Go ile Merhaba Dünya Programı
İlk go uygulamamız için bir klasör oluşturarak işe başlayalım. Go projeleri, modüller halinde organize edilmektedir. Modülümüzü tanımlamak adına go mod init <modul_adi> komutu kullanılır. Bu komut go.mod isimli bir dosya oluşmasına sebep olacaktır.

Sonrasında ise main.go dosyamızı ekliyoruz.

Modül içerisin paketler tanımlanır. Modüller, paketler e kod dosyalarının organizasyonu ile ilgili detaylı bilgiye şu linkten ulaşabilirsiniz. Burada main paketimizi çalıştırıyoruz. Çalıştırılabilir uygulamalar main paketi içerisindeki main fonksiyonundan başlar. Ayrıca fmt isimli bir paket kullandığımızı görüyoruz. Bu paket go’nun standart kütüphanesinde bulunan bir pakettir. Standart giriş/çıkış ve metin formatlama işlemleri yapmamızı sağlar. Yazdırma işlemi içinse Printf fonksiyonu kullanılmıştır.
Bazı Go Özellikleri
Değişken Tanımlama

Go değişken tiplerinin statik olarak tanımlanır. Fakat değişken değerinin tanımlanma esnasında verildiği durumlarda “:=” sentaks’ıyla doğrudan tanımlama yapılır. Bu yazımda tip otomatik olarak çözümlenir. Bu nedenle açıkça belirtilmez.
Fonksiyonlar


Go fonksiyonları birden fazla değer döndürebilmektedir.
Yapılar ve Pointer’lar


Birden fazla değişkeni barındıran veri tipleri tanımlanabilmekte ve tiplere metodlar tanımlanabilmektedir. Ayrıca gösterici (pointer) veri tipleri de bulunmaktadır.
Değer olarak Hata ele alma (Error as values)

Go dilinde bazı diğer dillerde bulunan “try/catch” mekanizması bulunmamaktadır. Hatalar doğrudan değer olarak tutulurlar ve hata mesajını taşırlar. Böylelikle hataların oluşabileceği noktalar açıkça belirtilmekte ve bu hataların ele alınmasında daha net kontrol sahibi olabilmekteyiz.
Defer Mekanizması
Bir fonksiyonun çalıştırılmasının, fonksiyonun çağrıldığı bloğun sonuna ertelenmesini sağlayan bir mekanizmadır. Böylece örneğin açtığımız bağlantıların kapatılması veyahut kullandığımız kaynakların serbest bırakması işlemlerini unutma ihtimalimizi düşürerek daha düzenli ve açık şekilde yapabiliyoruz.


Görmüş olduğunuz üzere defer edilen fonksiyonlar LIFO (last in first out) şeklinde, yani en son çağrıdan ilk çağrıya doğru çalıştırılmaktadır.
Arayüzler (Interfaces)
Go dilinde arayüzler bulunmaktadır. Arayüzler belirli metodların belirli yapılarda bulunduğundan emin olmak amacıyla kullanılmaktadır. Yapıların bir arayüzü implemente ettiği açıkça belirtilmez. Metodun tanımlanması yeterlidir.


Goroutines ile Eş Zamanlı Programlama


Goroutines, Go çalışma zamanı tarafından yönetilen thread’lerdir. Bu thread’ler eş zamanlı olarak çalıştırılmaktadır. Yukarıdaki örnekte say fonksiyonu 100ms saniye beklemektedir. Eğer goroutine kullanmasaydık, ilk say(“world”) çağrısının tamamlanmasını bekler, sonrasında say(“hello”) çağrısı çalıştırılır. Farklı thread’lerde çalıştırılan uzun süreli operasyonlar diğer thread’lerin akışını bozmamaktadır. Bu thread’ler aynı hafıza alanına erişime sahiptirler. O yüzden bu erişimi senkronize etmek için araçlara ihtiyaç duyulmaktadır. Go programlama dili channel denilen, goroutine’ler arasında haberleşme yapabileceğiniz bir mekanizma sunmaktadır.
Go Channels


Yukarıdaki kod parçası bir diziyi ortadan bölerek iki kısmının toplamını ayrı goroutine’lerde hesaplamaktadır. Öncelikle c isminde bir kanal oluşturulmuş ve bu kanal sum fonksiyonuna parametre olarak verilmiştir. Sum fonksiyonu hesaplamasını tamamladıktan sonra sonucu kanala göndermiştir. Ana fonksiyonun devamında kanaldan sonuçlar alınmıştır. Varsayılan davranış olarak kanala yazma ve kanaldan okuma işlemleri diğer taraf hazır olana kadar program akışını bloklar. Fakat buffered channel denilen ve belirli bir kapasitesi olan olan kanallar da bulunmaktadır. Bu kanallar kapasiteleri dolana kadar program akışını engellemezler. Buffered channel oluşturmak için make fonksiyonuna kapasite parametresi verilir.

Bu yazımızda Go diline uzaktan bir bakış yaptık ve dilin bazı önemli özelliklerini öğrendik. Bu ve bunun gibi gibi pek çok içerik için bizleri internet sitemiz ve sosyal medya hesaplarımız üzerinden takip etmeyi unutmayın!