Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
19 yazı bulundu
Go Nedir, Neden Var? C# Geliştiricisi için Go'nun Felsefesi, Toolchain'i ve Ne Zaman Seçilir
Backend SERİ 01

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.

15 Kas 2026 14 dk 5
Go Kurulumu, Module'ler ve Proje Yapısı: go.mod, Package'lar, internal/ ve cmd/
Backend SERİ 02

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ı.

15 Kas 2026 13 dk 4
Go Temelleri: Tipler, Zero Value, Slice, Map, Pointer ve Kontrol Akışı
Backend SERİ 03

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ı.

15 Kas 2026 16 dk 2
Go'da Struct, Method ve Interface: Class'sız OOP, Embedding ve Implicit Interface
Backend SERİ 04

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ğı.

15 Kas 2026 15 dk 3
Go'da Error Handling: error Değerleri, Wrapping, errors.Is/As/AsType ve panic
Backend SERİ 05

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.

15 Kas 2026 15 dk 3
Go Generics ve Iterator'lar: Type Parameter, Constraint, range-over-func ve Generic Method'lar
Backend SERİ 06

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ı.

15 Kas 2026 17 dk 3
Goroutine ve Channel: Go'nun Concurrency Modeli
Backend SERİ 07

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.

15 Kas 2026 14 dk 4
Go'da Concurrency Pattern'leri: context, sync, errgroup, Worker Pool ve Goroutine Leak
Backend SERİ 08

Go'da Concurrency Pattern'leri: context, sync, errgroup, Worker Pool ve Goroutine Leak

Go'da eşzamanlı erişilen veri ya bir mutex ile korunur ya da bir channel ile sahibine bırakılır; korunmayan map process'i çökertir, korunmayan sayaç ise sessizce aynı sipariş ID'sini üretir. Bookstore'da concurrent map writes ve race detector, Service ile memstore'un mutex ile düzeltilmesi, context ile iptal ve deadline, WaitGroup.Go, errgroup ile 10.000 faturalık worker pool, Go 1.27'nin goroutineleak profili ve synctest ile 15 dakikalık testi anında çalıştırmak.

15 Kas 2026 14 dk 4
net/http ile HTTP Server: ServeMux Pattern Routing, Handler, Middleware ve Timeout'lar
Backend SERİ 09

net/http ile HTTP Server: ServeMux Pattern Routing, Handler, Middleware ve Timeout'lar

Go'da bir HTTP servisi için standart kütüphane yeterli: ServeMux 1.22'den beri method ve wildcard pattern'lerini en spesifik olan kazanır kuralıyla eşliyor, middleware ise bir handler'ı saran sıradan bir fonksiyon. Bookstore API'sinin httpapi package'ına taşınması, RequestID ve Logging middleware'leri, CORS ve CrossOriginProtection, 307 redirect, pattern çakışması panic'i, WriteTimeout'un handler'ı durdurmaması ve slowloris'e karşı http.Server timeout'ları.

15 Kas 2026 13 dk 4
Go'da JSON ve Request Validation: encoding/json, json/v2, Struct Tag'leri ve Body Sınırları
Backend SERİ 10

Go'da JSON ve Request Validation: encoding/json, json/v2, Struct Tag'leri ve Body Sınırları

Go'da bir JSON body'yi güvenle okumak için Content-Type, MaxBytesReader ile boyut sınırı, DisallowUnknownFields ve tek değer kontrolü gerekir; encoding/json v1 ise alan adlarını büyük/küçük harfe bakmadan eşleştirip tekrar eden alanda sonuncuyu alır. Bookstore'da POST /api/orders, *int ile eksik değer, errors.Join ağacından validation listesi, ASP.NET Core ile aynı sözleşmede Problem Details, Go 1.27'nin json/v2 farkları ve fiyatı float64 yerine kuruşla taşımak.

15 Kas 2026 14 dk 3
Go'dan SQL Server ve PostgreSQL'e: database/sql, go-mssqldb, Connection Pool, Transaction ve sqlc
Backend SERİ 11

Go'dan SQL Server ve PostgreSQL'e: database/sql, go-mssqldb, Connection Pool, Transaction ve sqlc

Go'da veritabanına database/sql ile bağlanılır: sql.Open bir connection değil connection pool döndürür, driver blank import ile kaydolur, sipariş ve stok düşümü BeginTx, defer Rollback ve Commit ile tek transaction'da yapılır. Bookstore'un siparişleri go-mssqldb ile SQL Server'da: pool ayarları, koşullu UPDATE ile lost update'i önlemek, Scanner/Valuer ile decimal'dan kuruşa, rows.Close sızıntısı, datetime2 saat dilimi tuzağı, pgx ve sqlc'nin SQL Server durumu.

15 Kas 2026 21 dk 3
Go'da Test: testing Paketi, Table-Driven Test, httptest, Benchmark ve synctest
Backend SERİ 12

Go'da Test: testing Paketi, Table-Driven Test, httptest, Benchmark ve synctest

Go'da test için framework kurulmaz: _test.go dosyaları, t.Run ile table-driven test, interface'i karşılayan elle yazılmış fake'ler ve httptest yeter. Bookstore'da stok kuralının tablo testi, sabit saat, mux üzerinden handler testi, Go 1.27'nin httptest.NewTestServer'ı ile synctest, negatif tutar hatasını bulan fuzz testi, generic kodun benchmark'ı, SQL Server'a giden entegrasyon testi, coverage ve go test -race.

15 Kas 2026 17 dk 3
Blog Haritası