deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Go 1.26, new() ifadesini ifade kabul etmeye başladı; pointer yardımcılarını silmenin yolu açıldı

Go 1.26 ile yerleşik new(), new(42) veya new(time.Now()) gibi ifadeleri kabul etmeye başladı; ayrıca yeni bir go fix modernizer, el yazımı pointer yardımcılarının çoğunu otomatik olarak yeniden yazabiliyor.

Go 1.26, new() ifadesini ifade kabul etmeye başladı; pointer yardımcılarını silmenin yolu açıldı

dev.to'da yer alan bir yazıya göre 10 Şubat 2026'da yayımlanan Go 1.26 sürümü, yerleşik new() işlevinin yalnızca bir tür değil, bir ifadeyi de argüman olarak kabul etmesini sağlıyor. new(42) ve new(time.Now()) gibi çağrılar artık derleniyor ve pakete dahil edilen bir go fix modernizer, el yazımı pointer yardımcılarının çoğunu otomatik olarak yeniden yazabiliyor.

On yıllık bir boşluk

Go, &S{a: 3} ile bir composite literal'in adresini almayı her zaman kolaylaştırmıştı; ancak bir sabitin veya bir işlev çağrısının sonucunun adresi alınamıyordu, dolayısıyla &42 hiçbir zaman derlenmedi. Dilde optional türü bulunmadığı için, encoding/ veya protocol buffers ile serileştirme yaparken "alan ayarlanmamış" ile "alan sıfır" durumlarını ayırt etmenin standart yolu pointer'lar; yazıda alıntılanan sürüm notları da bu özelliği, optional bir değeri işaretlemek için pointer kullanan serileştirme paketleri için özellikle kullanışlı olarak öne çıkarıyor.

Sonuç, her yerde çoğaltılmış tek satırlık yardımcılar oldu — ptr[T], StringPtr, meşhur utils/pointer.go — artıca protobuf-go'daki proto.String ve proto.Int64, k8s.io/utils'taki ptr.To ve samber/lo'daki ToPtr gibi ekosistem kopyaları. Boşluğun kendisi eski: Rob Pike, Nisan 2021'de daha eski olan 9097'ye alternatif olarak 45624 numaralı öneriyi açtı; Alan Donovan ise Ekim 2025'te sorunu kapatarak, işin özgün talepten tam on bir yıl sonra tamamlandığına daka şakası yaptı.

Yeni biçim nasıl davranıyor

Yazıda alıntılanan güncel spesifikasyona göre, argüman bir x ifadesi olduğunda new, x'in türünde ve x'in değeriyle başlatılmış bir değişken ayırıyor. new(int) hâlâ sıfır değerli bir int'e pointer döndürüyor; new(123) ise 123'e bir pointer döndürüyor; ikisi de *int.

Bu sözdizimini kullanmak için bir module — ya da bir build constraint ile tek bir dosya — Go 1.26 veya sonrasını bildirmeli, örneğin go mod edit -go=1.26 ile. Yazı, go.mod'u yükseltmenin module'ü import eden herkes için minimum Go sürümünü yükselttiğine dikkat çekiyor; bu, uygulamalar için genellikle sorun değil ama kütüphaneler için gerçek bir karar. 19 Ağustos 2026'dan beri yayında olan Go 1.27 bu konuda bir şey değiştirmedi, yani her iki güncel sürüm de kullanılabilir.

Süpürme işini go fix yapıyor

Go 1.26 ayrıca go fix'i, go vet ile aynı analiz çerçevesi üzerinde, dilin modernizer'larının merkezi olarak yeniden inşa etti. Bunlardan biri olan newexpr tam olarak bu deseni hedefliyor. Analizcinin new-like functions dediği yapıları arıyor — tek bir non-variadic parametre, tek bir pointer sonuç ve parametrenin adresini döndürmekten başka bir şey yapmayan bir gövde — yardımcının gövdesini inline yönergesiyle new(x) döndürecek şekilde yeniden yazıyor ve ptr("dark") gibi çağrı noktalarını new("dark") olarak değiştiriyor.

İki uyarı var. Fix aracı yalnızca zaten Go 1.26 gerektiren dosyalara dokunuyor; bu yüzden önce go.mod'u yükseltin, yoksa diff boş döner. Ve yazıda alıntılanan Go blogu, go fix'i sabit bir noktaya ulaşana kadar tekrar tekrar çalıştırmayı öneriyor; genellikle iki kez yeterli. Yazar, süpürmeyi kendilerinin çalıştırmadığını ekliyor, dolayısıyla herhangi bir repository için gerçek kaynak -diff önizlemesi. Ardından yardımcıları silin ve go build ./... çalıştırın — geriye kalan derleme hataları elle incelenecek kuyruğu oluşturur.

Elle yapılması kalanlar

Fix aracı, bir çağrının türünü değiştirecek her yeniden yazımı atlıyor. new'e geçen typed olmayan (untyped) bir sabit varsayılan türünü alır, dolayısıyla new(42) bir *int'tir; *int64 bir alan bu nedenle açık bir dönüşüm gerektirir: new(int64(5000)). Yazı, bir protobuf mesajında çok sayıda int64 alan olduğunda proto.Int64(5000)'ün bundan daha okunaklı olabileceğini kabul ediyor, yani bazı yardımcıları tutmak savunulabilir. Ayrıca kendi bildirimleriyle new'i gölgeleyen kapsamlar ve untyped composite literal'ler de dokunulmadan bırakılıyor. Ve yerleşik işlevler işlev değeri olarak kullanılamayacağı için, func(T) *T beklenen bir yere new geçirilemiyor — bir yardımcı için en net kalan durum bu.

Neden önemli

Bu, Go'nun en uzun süredir süren ergonomi şikayetlerinden birini kapatıyor ve ekiplerin yalnızca dilin bu eksikliğine geçici çözüm olarak var olan boilerplate'i silmesini sağlıyor. Anlamsal kazanç gerçek: nil pointer ile 0'a pointer, JSON ve protobuf'te "yok" ile "açıkça sıfır" ayrımını kodlar ve bu ayrımı yazmak artık bir import değil, yerleşik bir özellik. En az bunun kadar önemli olan teslim mekanizması — Go ekibi, dil değişikliğini vet destekli bir go fix modernizer ile eşleştirerek gelecekteki sözdizimi iyileştirmelerinin mevcut kod tabanlarına elle değil, mekanik olarak nasıl taşınabileceğini gösteriyor.

  • #go
  • #programming-languages
  • #pointers
  • #static-analysis
  • #developer-tools

İlgili yazılar