Go’nun tarihçesi

C, Pascal, Alef ve Oberon gibi programlama dillerinden esinlenerek, bir iç projesi olarak başlayan GO aslında Google’ın deneysel bir çalışmasıydı. Fakat başarıya ulaşan bu deney 2009 yılı sonlarında duyurularak kitlesel olarak kullanılan açık kaynaklı bir programlama diline dönüştü.

Go’nun avantajları

Go, bazıları bir çok programlama dilinde benzer olan, bazıları ise tamamen eşsiz özelliklerle geliyor. Go’nun en önemli özellikleri şunlar;

  • GO kodu platform bağımsız denebilir. Windows’da yazdığınız bir Go kodunu, sorun yaşamadan Unix bir makinede derleyip çalıştırabiliyorsunuz.
  • Go prosedürel (procedural), eş zamanlı (concurrent) ve dağıtık (distributed) programlama desteğine sahip.
  • Go güçlü bir ‘çöp toplama’ yani ‘garbage collection’ mekanizmasına sahip, bu da sizi hafıza atama ve temizleme derinden kurtarıyor. ( Daha önce geldiğiniz programlama diline göre bu sizin için hiçbir şey ya da çok şey ifade edebilir)
  • Go’da bir ön işleyici (preprocessor) gereği yoktur ve çok hızlı derleme yapar.
  • Go ile web uygulamaları ve test amaçlı web sunucular oluşturabilirsiniz.
  • Standart Go kütüphanesi size çok sayıda paket sunar, bu paketler Go’yu geliştiren ekip tarafından test ve debug yapıldığı için neredeyse hatasız kabul edebilirsiniz.
  • Go statik bağlantılar kullanır, bu da oluşturulan binary dosyaların aynı işletim sistemine sahip bilgisayarlara taşınıp çalıştırılabileceği anlamına gelir. Yani Go programınızı oluşturduktan sonra kütüphaneler, bağımlılıklar ve bunların farklı sürümleri ile boğuşmadan sadece binary dosya ile çalıştırabilirsiniz.

Öte Go nesne tabanlı programlamayı doğrudan desteklemez ve bu konuda dalga geçilen PHP’nin bile çook çoook uzun zamandır nesne tabanlı programlama desteği olduğu düşünülünce bu özellikle nesne tabanlı programlama dillerinde kodlama yapmaya alışkın geliştiriciler için zor olabilir.

Go’nu katı kuralları

Go bir çok programlama diline göre katı kurallar ile geliyor, sizi iyi ve temiz kod yazmaya zorluyor. Bu başta can sıkıcı olsa da kodunuzun okunurluğunu arttırdığı gibi hata ve bug içerme olasılığını da azaltıyor.

Örneğin;

Çoğu programlama dilin, bir paket veya kütüphaneyi using veya import betikleri ile programınıza dahil edebilirsiniz ve kodunuzun içinde bunları kullanmasanız da sorun olmaz. Go’da import ettiğiniz bir paketi kullanmıyorsanız hata ile karşılaşırsınız. ( IDE’nizin eklentileri hataya mahal vermeden ilgili satırı kaldırabilirler ama o ayrı bir konu )

Benzer şey değişkenler için de geçerli. Bir değişkeni tanımladıysanız, ona bir değer atamış dahi olsanız bu değişken gerçekten kullanılmıyorsa hata alırsınız. Değer atadığıma göre kullandım diye düşünmeyin.

Benzer bir durum köşeli ayraçlar içinde geçerli, diğer dillerde ayraçı koşuulu ifade veya tanımlama ile aynı satır veya bir alt satırda kullanmanız farketmez, fakat GO alt satırda olması durumunda hata verecektir.

package min

import (
    "fmt"
)

func main() 
{
    fmt.Println("Bu kod hata vereceği için bu mesaj ekrana hiç yazılmayacaktır!")
}

Yukarıdaki kod hata verecektir ve düzeltilmesi için şu şekilde yazılmalıdır;

package min

import (
    "fmt"
)

func main() {
    fmt.Println("Bu kod hata vermeden çalışacaktır!")
}

Go’da hata işleme ( Error Handling )

Go’da Hata ve hata işleme birbirinden çok farklı iki konu. Go hata mesajlarını o kadar çok seviyor ki hata ‘error’ türünde bir tip tanımlaması bile var. (string, integer, float vs. vs. gibi bir de error tipi var) Yani Go’nun size sağladığı bir hata mesajını yeterli bulmazsanız hemen ‘error’ tipinde bir hata mesajı oluşturabilirsiniz. Hatta bir Go paketi oluştururken kendi hatalarınızı ve hata işleyicilerinizi tanımlamak zorundasınız.

Go’da hata (error) mesajları diğer programlama dillerindeki istisnalar (exception) gibi değildir. Go’daki hatalar sadece fonksiyondan ‘error’ tipinde dönen Go nesneleridir ve bu nesne ile ne yapılacağını sizin tanımlamanız gerekir.

Go error veri tipi

Go’da uygulama geliştirirken çoğu zaman hataları bizzat tanımlamanız gerekecek. Go dilinde alışkın olduğumuz gibi istisna fırlatmak, false veya boş değer dödürmek gibi yöntemler yerine, hataysa ‘hata’ tipinde Go nesneni döndürüyoruz.

Şimdi Go’da yeni bir hata nasıl tanımlanır onu inceleyelim.

package main

import (
    "errors"
    "fmt"
)

func exampleError(x, y int) error {
    if x == y {
        return nil
    } else {
        err := errors.New("The numbers are not equal")
        return error
    }
}

func main() {
    err := returnError(1,1)
    if nil == error {
        fmt.Println("The numbers are qeual")
    } else {
        fmt.Println(err)
    }

    if "The numbers are not equal" == error.Error() {
        fmt.Println("Please try again!");
    }
}

Yukarıdaki kodda int tipinde iki değişken alan ve error tipinde bir sonuç döndüren bir fonksiyon tanımladık.

Eğer değerler birbirine eşitse değer olarak nil döndürüyor. nil içerikli bir error mesajı da hata olmadığı anlamına geliyor.

Fakat aksi durumda errors paketinin New metodu ile yeni bir hata oluşturuyor ve hata mesajını da string olarak bu metoda gönderiyoruz. Sayıların birbirine eşit olmadığı durumda oluşturduğumuz bu hata mesajı döndürülmüş oluyor.

Sonraki Adım: Go Kurulumu

“Go’yu kurmadan örnek kodlar verdin, hatta işleme anlattın, şimdi Go kuralım diyorsun” diye düşünebilirsiniz. Şimdiye kadar anlattığım kodlar Go’daki yaklaşımı açıklamak içindi. Kod yazmaya başlamak için ‘Go Ubuntu Linux’da nasıl kurulur?‘ veya ‘Go Windows 10’da nasıl kurulur?‘ yazılarımı inceleyebilirsiniz.

Kapak görseli Renee French tarafından Creative Commons 3.0 Attributions lisansı ile lisanslanmıştır.

Bu Yazıda Yapılan Değişiklikler
  • 11.05.2022: Yazı özeti düzenlendi.