Alesta WEB

Kısa cevap: Go 1.27 ile Go ekibi yıllardır "yapmayacağız" dediği bir özelliği getirdi: generic metotlar. Artık bir metot kendi tip parametrelerini tanımlayabiliyor. Bu, Go 1.18'deki generics'ten bu yana dil tanımındaki en büyük değişiklik. Yanında iç içe struct alanlarını doğrudan başlatma, genişletilmiş tip çıkarımı, go fix'e dört yeni modernleştirici, sürüm belirterek go doc, küçük nesne ayırmada %30'a varan hızlanma ve genel kullanıma açılan goroutineleak profili geliyor. Arayüz metotları ise hâlâ generic olamıyor (Go 1.27 generic methods, new features).
Generic metotlar: ne değişti? (Generic methods in Go 1.27)
Go 1.18 generics'i getirdiğinde önemli bir kısıt vardı: tip parametresi yalnızca fonksiyonlarda ve tiplerde tanımlanabiliyordu. Bir tipin metodu, tipin kendi parametrelerini kullanabiliyor ama yeni bir tip parametresi açamıyordu. Bu yüzden "bir listenin elemanlarını başka tipe dönüştür" gibi işlemler metot olarak değil, paket düzeyinde ayrı bir fonksiyon olarak yazılmak zorundaydı.
// Go 1.26 ve öncesi: Map metot olamazdı, paket fonksiyonu olmak zorundaydı
func Map[T, U any](l *List[T], f func(T) U) *List[U] { ... }
sonuc := Map(liste, strconv.Itoa)Go 1.27 ile metot bildirimi kendi tip parametrelerini taşıyabiliyor:
type List[T any] struct{ items []T }
// Go 1.27: metot kendi U tip parametresini tanımlıyor
func (l *List[T]) Map[U any](f func(T) U) *List[U] {
out := &List[U]{items: make([]U, 0, len(l.items))}
for _, v := range l.items {
out.items = append(out.items, f(v))
}
return out
}
sonuc := liste.Map(strconv.Itoa)Fark sadece sözdizimi değil. İşlev artık tipin "ad alanında" duruyor: IDE'de nokta koyduğunuzda öneri listesinde çıkıyor, belgelerde tipin altında görünüyor ve paket düzeyinde MapList, MapSet, MapTree gibi isim kalabalığına gerek kalmıyor. Standart kütüphane de bunu kullanmaya başladı: math/rand/v2 paketindeki N fonksiyonu artık (*Rand) N[Int intType](Int) Int imzasıyla metot olarak da var.
Sınır: arayüzler (interfaces)
Önemli bir kural değişmedi: arayüz metotları tip parametresi tanımlayamaz ve bir arayüz metodu generic bir metotla karşılanamaz. Yani generic Map metodu olan bir tip, Map içeren bir arayüzü uygulamış sayılmaz.
Bu kısıtın sebebi Go'nun derleme modeli. Arayüz çağrıları çalışma zamanında bir metot tablosu üzerinden yapılır. Generic bir arayüz metodu, her olası tip kombinasyonu için tabloda bir kayıt gerektirirdi ve bu derleme anında bilinemez. Go ekibi yıllarca generic metotları bu yüzden reddetti; sonunda "arayüzler hariç" diyerek orta yolu buldu. Pratikte bu, generic metotların somut tiplerde yardımcı işlemler için ideal olduğu, soyutlama katmanında ise eski desenlerin sürdüğü anlamına geliyor.

Diğer dil değişiklikleri
- İç içe struct alanlarını doğrudan başlatma: Struct literal yazarken gömülü (embedded) ya da iç içe struct'ların alanları, geçerli herhangi bir alan seçicisiyle doğrudan başlatılabiliyor. Daha önce her gömülü struct'ı ayrı bir literal olarak yazmak gerekiyordu.
- Genişletilmiş tip çıkarımı: Generic bir fonksiyon, eşleşen bir fonksiyon tipine atandığı ya da dönüştürüldüğü her yerde tip argümanı yazmadan kullanılabiliyor. Bileşik literaller, tip dönüşümleri ve kanal gönderimleri de buna dahil.
Araç zinciri: go fix, go doc, go mod tidy
go fix son sürümlerde eski kodu yeni dil özelliklerine taşıyan "modernleştiricilere" dönüştü. Go 1.27 dört tane daha ekliyor: atomictypes, embedlit, slicesbackward ve unsafefuncs. Adlarından anlaşılacağı gibi, eski sync/atomic fonksiyon çağrılarını atomik tiplere, gömülü struct literallerini yeni yazıma ve elle yazılmış ters döngüleri slices paketine taşımayı hedefliyorlar. Değişiklikleri uygulamadan önce görmek için:
go fix -diff ./...go doc artık sürüm belirterek sorgulanabiliyor. Bağımlılığın başka bir sürümünü projeye eklemeden belgesine bakmak için:
go doc example.com/pkg@v1.2.3go mod tidy ise go.mod içindeki dağınık birden fazla require bloğunu otomatik olarak standart "doğrudan / dolaylı" iki blok düzenine topluyor. Elle düzenlenmiş eski go.mod dosyalarında ilk çalıştırmada büyük bir fark görürseniz şaşırmayın; içerik aynı, düzen değişiyor.
Çalışma zamanı ve performans
Bellek ayırıcı, küçük nesneler için boyuta özel yollar kullanmaya başladı. Go ekibinin ölçümüne göre küçük nesne ayırma maliyeti %30'a kadar düşüyor; çok sayıda kısa ömürlü nesne üreten programlarda toplam etki yaklaşık %1. Küçük görünebilir, ama yalnızca yeniden derleyerek elde edilen bir kazanç.
Daha dikkat çekici olan, runtime/pprof içindeki goroutineleak profilinin genel kullanıma açılması. Bu profil, kalıcı olarak bloke olmuş, yani hiçbir zaman ilerlemeyecek goroutine'leri otomatik tespit ediyor. Kapanmayan bir kanalı bekleyen ya da iptal edilmeyen bir context'e takılan goroutine'ler, uzun çalışan sunucularda yavaş bellek sızıntılarının en yaygın sebebi. Artık bunları üretim profilinde doğrudan görmek mümkün.
Geçiş kontrol listesi
go.modiçindekigosatırını1.27yapın; generic metotlar yalnızca bu dil sürümüyle derlenir.go fix -diff ./...ile önerilen modernleştirmeleri gözden geçirin, uygunsa uygulayın.go mod tidyçalıştırıpgo.moddüzen değişikliğini ayrı bir commit olarak alın; kod incelemesinde gürültü yaratmasın.- Paket düzeyindeki
MapX/FilterXtarzı yardımcıları metoda taşımayı düşünün, ama arayüz uygulayan tiplerde bunun arayüzü karşılamayacağını unutmayın. - Uzun çalışan servislerde
goroutineleakprofilini izleme düzeninize ekleyin.
Go'yu API sunucuları, kuyruk işçileri ve komut satırı araçları için kullanıyorsanız 1.27 güvenle geçilebilecek bir sürüm. Önceki sürümün özelliklerini Go 1.24 rehberimizde ele almıştık. Alesta WEB olarak arka uç servislerinizin tasarımı ve sürüm geçişleri için web yazılım hizmetlerimize göz atabilirsiniz.
Sık sorulan sorular
Go 1.27 ne zaman çıktı?
19 Ağustos 2026'da yayımlandı.
Generic metot nedir?
Kendi tip parametrelerini tanımlayan metottur. Örneğin func (l *List[T]) Map[U any](f func(T) U) *List[U]. Go 1.27'den önce bu yazılamıyordu.
Arayüzlerde generic metot kullanabilir miyim?
Hayır. Arayüz metotları tip parametresi tanımlayamaz ve generic bir metot bir arayüz metodunu karşılamaz.
Eski kodum Go 1.27 ile derlenir mi?
Evet. Go 1 uyumluluk sözü geçerli; değişiklikler yeni yazım olanakları ekliyor, mevcut kodu bozmuyor.
goroutineleak profili ne işe yarar?
Hiçbir zaman ilerlemeyecek şekilde bloke olmuş goroutine'leri tespit eder. Kapanmayan kanal ya da iptal edilmeyen context kaynaklı sızıntıları bulmak için kullanılır.
Kaynaklar (References)
Kapak fotoğrafı: Juanjo Jaramillo / Unsplash

