Konu Başlıkları Gizle
- 1 Go Nedir ve Nerden Çıktı Bu?
- 2 Go'nun Güçlü Yanları
- 3 2. Derleme Hızı
- 4 3. Yerleşik Eşzamanlılık (Concurrency)
- 5 4. Garbage Collection (Çöp Toplama)
- 6 5. Statik Tipleme Ama Akıllıca
- 7 Go mu Python mu?
- 8 Kullanım Alanları
- 9 Benim Tavsiyem
- 10 Go ile Web API Geliştirme
- 11 Neden Go Web API için İdeal?
- 12 Mikroservis Mimarisi ve Go
- 13 Basit Bir Mikroservis Yapısı
- 14 Servisler Arası İletişim
-
15
İdiomatik Go: Kod Yazma Sanatı
- 15.1 Temel Prensipler
- 16 Pratik Bilgiler ve İpuçları
- 17 VS Code Kurulumu
- 18 Go ile Neler Yapabilirsiniz?
- 19 Öğrenme Kaynakları
- 20 Sonuç
Selamlar dostlar
Bugün sizlerle son birkaç aydır hayatımın resmen merkezine oturan, elimden düşüremediğim bir programlama dilinden bahsedeceğim. Go piyasada Golang diye de geçer. Bu rehberde size neden Go öğrenmeniz lazım, hangi alanlarda işinize yarar ve bu dil neden durup dururken bu kadar patladı, hepsini tek tek anlatacağım. Çayınızı kahvenizi alın, başlıyoruz.
Go Nedir ve Nerden Çıktı Bu?
Şimdi bu Go olayı 2009 yılında Google tarafından geliştirildi. Arkasındaki ekip şampiyonlar ligi gibi. Robert Griesemer, Rob Pike ve Ken Thompson. Bu adamlar C dilini ve Unix'i yaratan efsaneler biliyorsunuz, yani ne yaptıklarını gayet iyi biliyolar, boş adam değillerPeki durduk yere niye "hadi yeni dil yapalım" dediler? Çünkü Google'da milyonlarca satır kod var ve o zamanlar derleme süreleri saatler sürüyormuş. İllallah etmişler yani. Mevcut diller de ya çok karmaşık ya da modern donanımı, işlemcileri verimli kullanamıyor. Go, tam da bu dertlere derman olsun, işler hızlansın diye tasarlandı.
Go'nun Güçlü Yanları
Go'nun en hasta olduğum özelliği sadeliği abi. Dilin topu topu 25 tane anahtar kelimesi var. Şöyle bi kıyaslayalım da farkı görün:- C++ → 80+ anahtar kelime
- Java → 50+ anahtar kelime
- Python → 35 anahtar kelime
- Go → 25 anahtar kelime
2. Derleme Hızı
Go'nun derleme hızı şaka gibi arkadaşlar. Milyonlarca satır kod saniyeler içinde derleniyor. Bu özellik özellikle büyük projelerde çalışırken hayat kurtarıyor. Eskiden C++ projelerinde derlemeye basıp kahve molasına çıkardım, Go'da gözümü kırpana kadar işlem bitiyor.3. Yerleşik Eşzamanlılık (Concurrency)
İşte Go'nun en parladığı nokta burası. Goroutine'ler. Eşzamanlı programlama yapmak hiç bu kadar kolay olmamıştı valla. Bi fonksiyonun başına go yazıyosunuz ve boom, o fonksiyon artık ayrı bi thread'de çalışıyo (teknik olarak goroutine ama siz anladınız).
Kod:
go fonksiyonAdi() // Bu kadar basit işte.
4. Garbage Collection (Çöp Toplama)
Go'da bellek yönetimi otomatik. C'deki o meşhurmalloc/free belasıyla uğraşmıyorsunuz. Garbage Collector arka planda sessiz sedasız çalışıyor ve kullanılmayan bellekleri temizliyor.Meraklısına detay vereyim, Go'nun GC'si üç renkli işaretleme algoritması kullanıyor:
- Beyaz: Henüz bakılmamış nesneler
- Gri: İnceleniyo, referanslarına bakılıyo
- Siyah: İncelendi, hala kullanılıyo
5. Statik Tipleme Ama Akıllıca
Go statik tipli bir dil ama "tip çıkarımı" (type inference) sayesinde her yere amele gibi tip yazmak zorunda değilsiniz:
Kod:
// İkisi de aynı kapıya çıkıyo
var isim string = "Kaan"
isim := "Kaan" // Go burda tipi kendi anlıyo, canını yerim :)
Go mu Python mu?
Çok kafa karıştırıyor bu mevzu, o yüzden şuna bi açıklık getireyim detaylıca:Performans
Python yorumlanan (interpreted) bir dil, Go ise derlenen (compiled) bir dil. Pratikte bu ne demek?
- Go: Doğrudan makine koduna derlenir, C'ye yakın performans verir.
- Python: Satır satır yorumlanır, Go'dan 10-100 kat daha yavaş kalabilir.
Eşzamanlılık
- Go: Goroutine'ler ve channel'lar ile doğal bir eşzamanlılık var.
- Python: GIL belası yüzünden gerçek paralellik çok zor.
Kullanım Alanları
Python nerde daha iyi:- Veri bilimi ve makine öğrenmesi AI
- Hızlı prototip çıkarma
- Script yazımı
- Geniş kütüphane gerektiren projeler
- Web servisleri ve API'ler
- Mikroservisler
- Sistem programlama
- CLI araçları
- Yüksek performans gerektiren uygulamalar
Benim Tavsiyem
İkisini de öğrenin abi, ikisinin yeri ayrı. Ben genelde şöyle yapıyorum:- Hızlı bi script mi lazım? → Python
- Production'a çıkacak sağlam bi API mi? → Go
- Veri analizi mi? → Python
- Performans kritik mi? → Go
Go ile Web API Geliştirme
Go, web API geliştirmek için biçilmiş kaftan. Standart kütüphanesiyle bile ciddi işler yaparsınız ama ben Fiber gibi framework'leri kullanıyorum, işi bayağı kolaylaştırıyor.Basit Bir API Örneği (Fiber ile)
Kod:
package main
import (
"github.com/gofiber/fiber/v2"
)
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Merhaba Dünya!")
})
app.Get("/kullanici/:id", func(c *fiber.Ctx) error {
id := c.Params("id")
return c.JSON(fiber.Map{
"id": id,
"isim": "Kaan",
})
})
app.Listen(":3000")
}
Neden Go Web API için İdeal?
- Hız. Fiber saniyede yüz binlerce isteği rahatlıkla karşılar.
- Düşük Bellek. Her istek için goroutine açıldığı için çok az RAM yer.
- Tek Binary. Tüm uygulama tek bir çalıştırılabilir dosya (.exe gibi) olur, Docker image'ları küçücük kalır.
- Kolay Dağıtım. Bağımlılık derdi yok (node_modules cehennemi yok), binary'yi al at sunucuya çalışsın.
Mikroservis Mimarisi ve Go
Mikroservisler konusunda Go artık standart oldu. Neden mi?Go'nun Mikroservis Avantajları
- Hafif Binary'ler: Her servis küçük bi dosya olarak derlenir (genelde 10-20MB falan).
- Hızlı Başlatma: Milisaniyeler içinde servis ayağa kalkar.
- Düşük Kaynak Tüketimi: Az RAM, az CPU harcar.
- Kolay Container'laştırma: Docker image'ları minimal boyutta olur.
Basit Bir Mikroservis Yapısı
Kod:
// Kullanıcı servisi
package main
import (
"encoding/json"
"net/http"
)
type Kullanici struct {
ID int `json:"id"`
Isim string `json:"isim"`
Email string `json:"email"`
}
func kullanicilariGetir(w http.ResponseWriter, r *http.Request) {
kullanicilar := []Kullanici{
{ID: 1, Isim: "Ali", Email: "[email protected]"},
{ID: 2, Isim: "Ayşe", Email: "[email protected]"},
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(kullanicilar)
}
func main() {
http.HandleFunc("/kullanicilar", kullanicilariGetir)
http.ListenAndServe(":8080", nil)
}
Servisler Arası İletişim
Mikroservislerin birbiriyle konuşması lazım tabi. Go'da bunun için gRPC çok popüler:
Kod:
// gRPC ile yüksek performanslı iletişim
// Proto dosyasından otomatik kod üretiliyor
client := pb.NewKullaniciServiceClient(conn)
kullanici, err := client.KullaniciGetir(ctx, &pb.KullaniciIstegi{Id: 1})
İdiomatik Go: Kod Yazma Sanatı
Go'da sadece "çalışan" kod yazmak yetmez arkadaşlar, "idiomatik" kod yazmanız lazım. Yani dilin felsefesine, raconuna uygun, okunabilir kod demek bu.Temel Prensipler
1. Basitlik Her Şeyden Önce
Kod:
// KÖTÜ - Gereksiz karmaşık, kafa karıştırıcı
func topla(sayilar []int) int {
sonuc := 0
for i := 0; i < len(sayilar); i++ {
sonuc = sonuc + sayilar[i]
}
return sonuc
}
// İYİ - Basit ve anlaşılır
func topla(sayilar []int) int {
toplam := 0
for _, sayi := range sayilar {
toplam += sayi
}
return toplam
}
Kod:
// KÖTÜ
sonuc, err := birSeyYap()
if err == nil {
// başarılı durumu işle
// ...uzun kod...
} else {
return err
}
// İYİ - Early return candır (Hatayı başta yakala dön)
sonuc, err := birSeyYap()
if err != nil {
return err
}
// başarılı durumu işle
// ...uzun kod...
Kod:
// Kısa, anlamlı değişken isimleri
for i, v := range values { } // döngülerde kısa isimler OK
// Fonksiyon isimleri ne yaptığını anlatsın
func KullaniciOlustur() { } // Export edilecekse (dışarı açılacaksa) büyük harf
func kullaniciDogrula() { } // İç kullanım içinse küçük harf
// Interface isimleri genelde -er ile biter
type Reader interface { }
type Writer interface { }
type Closer interface { }
Kod:
// KÖTÜ - Çok büyük interface, her şeyi doldurmuş
type Veritabani interface {
Ekle(veri interface{}) error
Sil(id int) error
Guncelle(id int, veri interface{}) error
Getir(id int) (interface{}, error)
Listele() ([]interface{}, error)
// ...daha onlarca metod
}
// İYİ - Küçük, odaklı interface'ler
type Okuyucu interface {
Oku(p []byte) (n int, err error)
}
type Yazici interface {
Yaz(p []byte) (n int, err error)
}
Go'da
gofmt diye bi nimet var ve bu tartışmasız kullanılıyor. "Tab mı space mi" kavgası yok çünkü herkes aynı formatı kullanıyor:
Kod:
go fmt ./... # Tüm projeyi formatlar, çiçek gibi yapar
Pratik Bilgiler ve İpuçları
Go Kurulumu- golang.org adresinden indirin.
- Kurun.
- Terminali açın ve go version yazın.
- Tebrikler, hazırsınız!
Kod:
package main
import "fmt"
func main() {
fmt.Println("Merhaba, Go dünyasına hoş geldin!")
}
go run main.goÖnemli Komutlar
Kod:
go run main.go # Derle ve çalıştır
go build # Derle (binary/exe oluştur)
go test # Testleri çalıştır
go mod init proje # Yeni modül başlat
go get paket/adi # Paket indir
go fmt ./... # Kodu formatla
go vet ./... # Olası hataları bul
VS Code Kurulumu
- VS Code'u açın.
- Extensions'a (Eklentiler) gidin.
- "Go" aratın ve "Go Team at Google"ın eklentisini kurun.
- İlk .go dosyasını açtığınızda gerekli araçları kurmanızı isteyecek, hepsine "Yes" deyin geçin.
Go ile Neler Yapabilirsiniz?
1. Web Servisleri ve API'lerDocker, Kubernetes, hatta Go'nun kendisi bile Go ile yazılmış. Web API geliştirmede Go artık standart haline geldi.
2. CLI Araçları
Cobra kütüphanesiyle çok profesyonel CLI araçları yapabilirsiniz. Kubernetes'in kubectli, Hugo, GitHub CLI falan hep Go ile yazıldı.
3. Sistem Programlama
Container runtime'ları (Docker, containerd), orchestration araçları (Kubernetes), monitoring sistemleri (Prometheus, Grafana) hep Go imzalı.
4. Veritabanı Araçları
CockroachDB, InfluxDB, TiDB gibi sağlam veritabanları Go ile yazılmış.
5. Blockchain
Ethereum'un ana implementasyonu (go-ethereum) Go ile yazılmış.
Öğrenme Kaynakları
Türkçe Kaynaklar- Go Programlama Dili - Türkçe Kitap- ksckaan1 arkadaşımızın hazırladığı harika kapsamlı bi kaynak.
- GitHub'da 191 yıldız almış, topluluk tarafından da destekleniyo.
- PDF ve EPUB formatlarında da var.
- A Tour of Go - Resmi interaktif tur, kesin bakın.
- Go by Example - Örneklerle öğrenmek isteyenlere birebir.
- Effective Go - İdiomatik Go yazmak için şart.
Sonuç
Go öğrenmeli misiniz? Bence kesinlikle evet, eğer şunları istiyosanız:- Web servisleri ve API'ler geliştirmek.
- Mikroservis mimarisi kullanmak.
- Performans sizin için önemliyse.
- DevOps/SRE alanında çalışıyosanız.
- CLI araçları geliştirmek istiyosanız.
- Cloud-native teknolojilerle ilgileniyosanız.
Son düzenleyen: Moderatör: