Menu

Golang nedir? Go dili örneklerle açıklandı

Go (çoğunlukla Golang diye anılır), hızlı ve güvenilir sunucular ile araçlar yazmak için Google'da tasarlanmış, statik tipli ve derlenen bir dildir. Bu sayfa ne olduğunu, ne için kullanıldığını ve nerede yetersiz kaldığını anlatır.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Go, Google'da geliştirilmiş, statik tipli ve derlenen bir programlama dilidir. Tek bir doğal binary üretir, saniyeler içinde derlenir, çöp toplayıcısı vardır ve eşzamanlılık goroutine'ler ile channel'lar sayesinde dilin içine gömülüdür. Asıl kullanım alanı sunucu tarafı yazılımlardır: API'ler, ağ servisleri ve bunları çalıştıran komut satırı ve bulut araçları.

Aşağıda eksiksiz bir Go programı var. Run'a basın.

Her Go programı package main içinde func main() ile başlar. := bir değişken tanımlar ve tipini çıkarır (burada []string, yani string'lerden oluşan bir slice). range slice'ı dolaşır ve size bir indeks ile bir değer verir. fmt ve strings standart kütüphaneden gelir; standart kütüphane o kadar geniştir ki birçok program başka hiçbir şey import etmez.

Go ve Golang: İsim Meselesi

Dilin adı Go'dur. "Golang", projenin ilk web sitesi golang.org'dan kalma bir takma addır (site artık go.dev adresindedir). İnsanlar bu adı kullanmaya devam etti, çünkü web'de "go" diye arama yapınca dil dışında her şey çıkar. Resmi dokümantasyon "Go" der, ama arama kutusuna neredeyse herkes "golang" yazar ve ikisi de aynı şeyi ifade eder. Ayrı bir "Golang" ürünü ya da lehçesi yoktur.

Go'yu Kim Yaptı ve Neden

Robert Griesemer, Rob Pike ve Ken Thompson, Go'yu 2007'de Google'da tasarlamaya başladı. Kasım 2009'da açık kaynak olarak yayımlandı ve Go 1.0 Mart 2012'de çıktı.

Motivasyon pratikti. Google'ın büyük C++ ve Java kod tabanlarının derlenmesi uzun sürüyordu, bağımlılık grafikleri zor yönetiliyordu ve çok çekirdekli makineler ile ağ servisleri artık standarttı, ama eşzamanlı kod yazmak hataya çok açıktı. Go'nun tasarımı bu sorunlara doğrudan cevap verir:

  • Hızlı derleme. Import'lar açıktır, kullanılmayan import derleme hatasıdır ve derleyici header dosyalarını yeniden ayrıştırmaz, bu yüzden büyük programlar saniyeler içinde derlenir.
  • Sade dil. Az anahtar kelime, tek döngü (for), kalıtım yok, exception yok. Farklı kişilerin yazdığı kod birbirine benzer, bu da büyük bir ekipte kod incelemesini kolaylaştırır.
  • Dil özelliği olarak eşzamanlılık. Eşzamanlı bir görev başlatmak tek bir anahtar kelimedir, go, ve channel'lar görevlerin haberleşmesini sağlar.
  • Kolay dağıtım. Çıktı, sunucuya kopyaladığınız tek bir binary'dir. Genellikle statik olarak bağlanır; cgo açıkken net gibi paketler sistemin C kütüphanesine bağlanabilir ve CGO_ENABLED=0 bunu kapatır.

Go 1.0 ile birlikte Go 1 uyumluluk sözü de geldi: Go 1.0 için yazılmış programlar sonraki 1.x sürümlerinde derlenmeye ve çalışmaya devam eder. Pratikte bu, araç zincirini güncellemenin kodunuzu nadiren bozduğu anlamına gelir ve ekiplerin uzun ömürlü servislerde Go'ya güvenmesinin büyük bir nedenidir.

Golang Ne İçin Kullanılır

Go en güçlü olduğu yerde bir program ağ ile konuşur, uzun süre çalışır ve kolayca dağıtılabilmesi gerekir:

AlanÖrnekler
Web API'leri ve mikroservislerHTTP ve gRPC servisleri, web ve mobil uygulamaların backend'leri
Bulut ve altyapı araçlarıDocker, Kubernetes, Terraform, Prometheus
Komut satırı araçlarıHer platform için tek binary olarak dağıtılan geliştirici CLI'ları
Proxy'ler, yük dengeleyiciler, DNS sunucuları
Veri hatlarıKuyruk okuyan, kayıtları dönüştüren, veritabanına yazan worker'lar

Masaüstü GUI uygulamaları, mobil uygulamalar, tarayıcı ön yüzleri ve sayısal hesaplama ya da makine öğrenmesi işleri için daha zayıf bir seçimdir; bu alanlarda başka ekosistemlerin çok daha iyi kütüphaneleri vardır.

Kodla Temel Özellikler

Tip çıkarımlı statik tipler

Her değişkenin tipi derleme zamanında sabittir, ama tipi nadiren açıkça yazarsınız. := onu çıkarır:

Go sayısal tipler arasında hiçbir zaman sessizce dönüşüm yapmaz. count * price derlenmez, çünkü biri int, diğeri float64; float64(count) dönüşümünü kendiniz yazarsınız. Bu, sessiz kesme ve hassasiyet hatalarını ortadan kaldırır.

Hatalar değerdir

Go'da exception yoktur. Başarısız olabilecek bir fonksiyon son sonuç olarak bir error döndürür ve çağıran taraf onu kontrol eder:

if err != nil kalıbı Go kodunun en tanıdık satırıdır. Uzundur ve amaç da budur: bir programın başarısız olabileceği her nokta, olduğu yerde görünür. Hataları sarmalamak ve incelemek için hata yönetimi sayfasına bakın.

Goroutine'ler ve channel'lar

Goroutine, programın geri kalanıyla eşzamanlı çalışan bir fonksiyondur. Birkaç kilobaytlık stack'e mal olur, bu yüzden binlercesini çalıştırmak normaldir. Channel'lar goroutine'ler arasında değerleri güvenle taşır:

Üç goroutine eşzamanlı çalışır, bu yüzden üç satır herhangi bir sırayla yazdırılabilir. Birkaç kez çalıştırırsanız farklı sıralar görebilirsiniz. main tam olarak üç değer alır, bu yüzden çıkmadan önce hepsini bekler.

"implements" olmadan interface'ler

Bir tip, doğru metotlara sahip olduğu anda bir interface'i karşılar. implements anahtar kelimesi yoktur:

Rect ve Circle hiçbir yerde Shape'ten bahsetmez, yine de ikisi de bir []Shape içinde saklanabilir. Bu sayede bir interface'i, somut tipler yazıldıktan çok sonra, onu kullanan pakette tanımlayabilirsiniz.

Tek araç zinciri

go komutu her şeyi yapar: go run derleyip çalıştırır, go build binary üretir, go test testleri çalıştırır, go fmt kodu biçimlendirir, go vet şüpheli yapıları yakalar ve go mod bağımlılıkları yönetir. gofmt ile zorlanan tek bir resmi biçimlendirme stili vardır, bu yüzden Go projelerinde süslü parantez ya da girinti tartışması olmaz.

Go'nun Bilerek Dışarıda Bıraktıkları

Başka dillerde yaygın olan bazı özellikler bilinçli olarak yoktur:

  • Sınıf ve kalıtım yok. Struct'lar, metotlar, interface'ler ve gömme (embedding) kullanırsınız.
  • Exception yok. Hatalar döndürülen değerlerdir. panic vardır, ama sıradan hatalar için değil, bug'lar içindir.
  • Ternary operatörü yok. Bir if/else yazarsınız.
  • while anahtar kelimesi yok. for her döngüyü karşılar.
  • Fonksiyon aşırı yükleme (overloading) ya da varsayılan argüman yok.
  • Generics yalnızca Go 1.18'den beri var ve C++ şablonları ya da Java generics ile karşılaştırıldığında bilerek sınırlı tutulmuştur.

Dürüst Ödünleşimler

Uzunluk. Açık hata kontrolleri ve ternary operatörü gibi kısayolların olmaması, Go kodunu eşdeğer Python ya da Kotlin kodundan uzun yapar. Okumak kolaydır; yazmak daha fazla satır ister.

Çöp toplama. Go'nun çöp toplayıcısının duraklama süreleri kısadır, ama yine de bir çöp toplayıcıdır. Katı gerçek zamanlı sistemler ya da her bellek ayırmanın önemli olduğu kod için C, C++ veya Rust size daha fazla kontrol verir.

Nil değerler. Go'da nil pointer'lar, map'ler, slice'lar ve interface'ler vardır. Nil pointer'ı dereference etmek çalışma zamanında panic'e yol açar ve derleyici bunu Rust'ın tip sisteminin yaptığı gibi engellemez.

Küçük bir tip sistemi. Toplam tipleri (sum types) yok, enum yok (onları sabitlerle ve iota ile kurarsınız) ve yaygın durumları karşılayan ama ileri düzey tip seviyesinde programlamayı karşılamayan generics.

Ekosistem boşlukları. Web servisleri, veritabanları ve bulut API'leri için kütüphaneler mükemmeldir. GUI, bilimsel hesaplama ve makine öğrenmesi için Python, C++ veya Julia'nın çok daha fazlası vardır.

Go'nun Diğer Dillerle Karşılaştırması

GoPythonJavaRust
Tip sistemiStatikDinamikStatikStatik
Çalışma biçimiDoğal binaryYorumlayıcıJVM bytecodeDoğal binary
BellekÇöp toplayıcılıÇöp toplayıcılıÇöp toplayıcılıSahiplik (ownership), GC yok
EşzamanlılıkGoroutine'ler, channel'larThread'ler, asyncio (GIL, CPU paralelliğini sınırlar)Thread'ler, sanal thread'lerThread'ler, async
Öğrenme eğrisiDüşükDüşükOrtaYüksek

Rust'ın öğrenme eğrisine ya da Java'nın törenselliğine girmeden derlenmiş dil performansı ve basit dağıtım istiyorsanız Go'yu seçin.

Go Öğrenmeye Değer mi?

Backend servisleri, komut satırı araçları ya da bulut altyapısı alanında herhangi bir şey yazıyorsanız, evet. O ekosistemin büyük kısmı Go ile yazılmıştır ve kaynak kodunu okumak işin bir parçasıdır. Dil küçük olduğu için gereken yatırım da mütevazıdır: temel söz dizimi birkaç gün, deyimsel eşzamanlılık ve hata yönetimi ise birkaç haftalık pratik ister.

Go'yu kendi bilgisayarınızda yazmaya başlamak için Go'yu kurun, ardından ilk programın her satırını açıklayan hello world sayfasını inceleyin.

Sıkça Sorulan Sorular

Golang ne için kullanılır?

Çoğunlukla backend ve altyapı yazılımları için: web sunucuları ve API'ler, mikroservisler, komut satırı araçları, ağ kodu ve bulut araçları. Docker, Kubernetes, Terraform ve Prometheus'un hepsi Go ile yazılmıştır. Masaüstü arayüzleri, mobil uygulamalar ya da veri bilimi için nadiren kullanılır.

Go ile Golang aynı şey mi?

Evet. Dilin adı Go'dur. "Golang" adı ilk web sitesinin adresi olan golang.org'dan gelir ve "go" kelimesi aramada zor bulunduğu için yerleşmiştir. İki ad da aynı dili ve aynı araç zincirini ifade eder.

Go programlama dilini kim yarattı?

Robert Griesemer, Rob Pike ve Ken Thompson, Go'yu 2007'den itibaren Google'da tasarladı. Kasım 2009'da açık kaynak olarak duyuruldu. Go'nun uyumluluk sözünü başlatan sürüm olan Go 1.0 ise Mart 2012'de çıktı.

Go öğrenmesi kolay bir dil mi?

Dilin kendisi küçüktür: 25 anahtar kelime, tek bir döngü yapısı ve bir öğleden sonrada okunabilecek kısa bir spesifikasyon. Başka bir dilde deneyimi olan programcıların çoğu birkaç gün içinde çalışan Go kodu yazar. Daha uzun süren kısım deyimlerdir: açık hata yönetimi, interface'ler ve goroutine'ler ile channel'larla doğru eşzamanlı kod yazmak.

Go derlenen bir dil mi, yorumlanan bir dil mi?

Derlenen bir dil. go build, yorumlayıcıya veya sanal makineye bağımlı olmayan, doğal makine kodundan oluşan bir binary üretir. go run da derler; yalnızca geçici bir konuma derleyip sonucu çalıştırır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA