Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Goroutine ve Channel: Go'nun Concurrency Modeli
Goroutine, runtime'ın az sayıda OS thread'ine dağıttığı ve 2 KB stack ile başlayan ucuz bir çalışma birimidir; channel ise iki goroutine'in buluştuğu, queue gibi davranmayan bir iletişim noktasıdır. 100.000 goroutine'in maliyeti, G-M-P scheduler'ı, async/await olmadan asenkron kod, unbuffered ve buffered channel, select ve timeout, nil/kapalı channel tablosu, Bookstore'da fan-out/fan-in ile stok kontrolü ve goroutine leak.
Go Generics ve Iterator'lar: Type Parameter, Constraint, range-over-func ve Generic Method'lar
Go'da constraint bir tip kümesidir: ~int64 yazmadığın sürece Money gibi isimli bir tip int64 isteyen generic fonksiyona verilemez. Bookstore'da generic Page[T] ile sayfalama, cmp.Ordered ve comparable, C# generics'ten farklar (variance yok, GC shape stenciling), iter.Seq ile kitapları yazara göre gruplayan iterator, yield tuzağı, LINQ zihniyetiyle kıyas ve Go 1.27'nin generic method'ları.
Go'da Error Handling: error Değerleri, Wrapping, errors.Is/As/AsType ve panic
Go'da hata bir dönüş değeridir: sentinel error'lar errors.Is ile, custom error tipleri errors.As ya da Go 1.26'daki errors.AsType ile tanınır, %w ise zinciri koruyarak bağlam ekler. Bookstore'da ErrOutOfStock ve ValidationError, errors.Join ile toplu doğrulama, pointer error'ı %w ile sarma tuzağı ve onu yakalayan Go 1.27 vet kontrolü, hatayı 404'e çevirmek, handler'daki panic'in boş cevap üretmesi ve recover middleware'i.
Go'da Struct, Method ve Interface: Class'sız OOP, Embedding ve Implicit Interface
Go'da class yok: veri struct'ta, davranış method'larda durur; state değiştiren method pointer receiver ister, interface'ler ise implicit'tir ve onu kullanan tarafta küçük tanımlanır. Bookstore'un sipariş modeli (NewOrder, Timestamps embedding'i, MarkPaid), orders.Repository ile memstore ve sqlstore, accept interfaces return structs, Stringer, type switch, method set hatası ve staticcheck'in yakaladığı nil interface tuzağı.
Go Temelleri: Tipler, Zero Value, Slice, Map, Pointer ve Kontrol Akışı
Go'da slice; pointer, len ve cap'ten oluşan küçük bir header'dır ve alt slice'lar aynı backing array'i paylaşır, bu yüzden books[:0] üzerinde çalışan bir filtre orijinal kataloğu bozar. Zero value felsefesi, iota ile sabitler, string/byte/rune farkı ve Türkçe karakterde len tuzağı, append'in kapasiteyi büyütmesi, nil map ve rastgele map sırası, pointer ve Go 1.26'nın new(expr)'i, 1.22 döngü değişkeni ve nil slice'ın JSON'da null olması.
Go Kurulumu, Module'ler ve Proje Yapısı: go.mod, Package'lar, internal/ ve cmd/
Go'da bir module go.mod ile tanımlanır: go satırı Go 1.21'den beri bağlayıcı bir minimum sürümdür, go.sum her bağımlılığın hash'ini tutar, indirmeler proxy.golang.org ve sum.golang.org üzerinden doğrulanır. go mod init'in yazdığı sürümün hikâyesi, toolchain satırı ve GOTOOLCHAIN, tool directive ile staticcheck, büyük harfle export, internal/ ve cmd/ yapısı, go work, go mod tidy -diff ve Go 1.27'de require bloklarının ikiye toplanması.
Go Nedir, Neden Var? C# Geliştiricisi için Go'nun Felsefesi, Toolchain'i ve Ne Zaman Seçilir
Go, Google'da büyük codebase'lerin yavaş build'ine ve karmaşıklığına cevap olarak doğmuş, az özellikli, native koda derlenen ve runtime'ı binary'nin içinde taşıyan bir dil. İki endpoint'li Bookstore servisinin Windows için 9,9 MB'lık tek .exe olması, 10 ms'de açılıp 12 MB kullanması, ASP.NET Core ile karşılaştırma tablosu, go build/vet/fmt/fix/doc, cross-compile, altı aylık release politikası ve Go'yu ne zaman seçmen gerektiği.