1 puan yazan GN⁺ 2 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Bu sürüm, generic metotlar odağında struct literal’larını ve tip çıkarımını iyileştiriyor; standart kütüphane, runtime ve araç zinciri genelinde pratik özellikler ekliyor
  • Boyuta özel bellek ayırma, 80 bayttan küçük bazı ayırmaların maliyetini %30’a kadar azaltıyor; ayırma yoğun programlarda yaklaşık %1 performans artışı ve yaklaşık 60 KB ikili dosya büyümesi bekleniyor
  • encoding/json/v2 resmen sunuluyor; mevcut encoding/json da içeride v2 kullanıyor, ayrıca standart UUID paketi ve FIPS 204 tabanlı ML-DSA imzaları ekleniyor
  • goroutineleak profili, traceback’te pprof etiketleri, sanal zaman için synctest.Sleep ve bellek içi HTTP test sunucusu ile tanılama ve eşzamanlılık testleri kolaylaşıyor
  • Zamanlayıcı kanallarının arabelleksiz hale gelmesi, HTTP yanıt gövdesinin otomatik tüketilmesi ve //go:linkname kısıtlarının sıkılaştırılması mevcut kodu etkileyebileceğinden Go 1.27’ye geçmeden önce uyumluluk kontrolü gerekiyor

Dil ve tip sistemi

  • Go 1.27’nin merkezindeki generic metotlar, receiver’dan bağımsız kendi tip parametrelerini bildirebiliyor
    • Önceden yalnızca üst seviye fonksiyonlar generic olabildiği için, bir tipe ait işlemler de paket fonksiyonu olarak yazılmak zorundaydı
    • Box[T].Map[U] gibi, girdiden farklı bir eleman tipi döndüren işlemler metot olarak tanımlanabiliyor
    • Interface’ler hâlâ tip parametreli metot bildiremiyor ve generic metotlarla interface implement edilemiyor
  • Struct literal anahtarlarında, yalnızca üst seviye alan adları değil geçerli alan seçicileri de kullanılabiliyor
    • Embedded struct’larda yükseltilmiş alanlar User{ID: 7} gibi doğrudan ilklendirilebiliyor
  • Fonksiyon tip çıkarımı dönüşümlere ve bileşik literal’lara kadar genişletildi
    • []func([]int) int{first, last} gibi, beklenen fonksiyon tipine dayanarak generic fonksiyonun tip argümanlarını çıkarıyor
    • Önceden first[int], last[int] gibi doğrudan instantiate etmek gerekiyordu

Runtime ve performans

  • Derleyici, boyuta özel ayırma rutinlerini çağırarak 80 bayttan küçük bazı bellek ayırmalarının maliyetini %30’a kadar düşürüyor
    • Gerçek ayırma yoğun programlarda toplam performans artışının yaklaşık %1 olması bekleniyor
    • Kod değişikliği gerekmiyor, ancak iş yükünden bağımsız olarak ikili dosya yaklaşık 60 KB büyüyor
    • GOEXPERIMENT=nosizespecializedmalloc ile devre dışı bırakılabilir; ancak bu seçenek Go 1.28’de kaldırılacak
  • Varsayılan olarak etkinleşen üç yeni derleyici optimizasyonu eklendi
    • Bir değerde kesin olarak 0 veya 1 olan bitleri izleyip tekrar eden işlemleri kaldıran known bits veri akışı geçişi
    • Döngü sırasında değişmeyen hesaplamaları döngü dışına taşıyan loop-invariant code motion
    • Koşullar uygunsa switch ifadelerini fallthrough dahil lookup table olarak derliyor
  • Deneysel GOEXPERIMENT=mapsplitgroup, map gruplarının bellek yerleşimini KVKVKVKV yerine KKKKVVVV yapıyor; varsayılan olarak kapalı
  • Linker, tip descriptor’larını ve itab’leri özel .go.type bölümüne taşıyor; typelinks ve itablinks kaldırılıyor
    • reflect.typelinks offset yerine tip döndürdüğü için, bu sembole //go:linkname ile erişen kütüphaneler etkilenebilir

Goroutine tanılama ve profilleme

  • go.mod dosyasında Go 1.27 veya üstünü kullanan modüller, traceback’teki goroutine başlığında runtime/pprof etiketlerini gösterir
    • pprof.Do ile eklenen {request: 42} gibi bağlamlar crash dump, SIGQUIT ve runtime.Stack çıktısında görünür
    • Hassas etiketlerin traceback’te açığa çıkmaması için GODEBUG=tracebacklabels=0 kullanılmaya devam edilebilir
  • Go 1.26’da deneysel olan goroutine sızıntı algılayıcı, resmi goroutineleak profiline yükseltildi
    • GC çalıştırarak kanallar veya mutex’ler gibi yerlerde sonsuza kadar ilerleyemeyecek goroutine’leri bulur ve stack’lerini yazdırır
    • Servislerde /debug/pprof/goroutineleak endpoint’i üzerinden toplanabilir; GOEXPERIMENT gerekmez

Kriptografi ve tanımlayıcılar

  • Yeni crypto/mldsa paketi, FIPS 204’ün kuantum sonrası imza ML-DSA uygulamasını sağlar
    • MLDSA44, MLDSA65, MLDSA87 adlı üç parametre seti anahtar/imza boyutu ile güvenlik seviyesi arasında denge kurar
    • crypto/x509 içindeki anahtar ve imzalara, ayrıca crypto/tls içindeki TLS 1.3 imza yöntemlerine ML-DSA eklendi
  • Standart kütüphanedeki yeni uuid paketi, RFC 9562 UUID’leri kriptografik olarak güvenli rastgele sayılarla üretir ve parse eder
    • uuid.New() genel kullanıma uygun yöntemi seçer; NewV4() saf rastgele, NewV7() ise oluşturma zamanına göre sıralı UUID üretir
    • Rastgele sayı tabanlı UUID’ler karşılaştırılabilir olduğundan == doğrudan kullanılabilir
    • Zamana göre sıralanan UUID v7, veritabanı anahtarları için uygundur

JSON ve veri işleme API’leri

  • encoding/json/v2 ve düşük seviyeli encoding/json/jsontext, GOEXPERIMENT=jsonv2 olmadan sunuluyor
    • Mevcut encoding/json v1 de içeride v2 implementasyonunu kullanıyor
    • Bazı hata mesajı ifadeleri dışında mevcut davranışı koruduğu için migrasyon gerekmiyor
    • Uyumluluk sorunu olursa GOEXPERIMENT=nojsonv2 ile özgün v1 implementasyonu geri getirilebilir
    • v2 performans için map anahtarlarını varsayılan olarak sıralamadığından, kararlı çıktı gerektiren testlerde json.Deterministic belirtilmelidir
  • strings.CutLast ve bytes.CutLast, değerleri son ayırıcıya göre böler
    • Ayırıcı yoksa tüm girdiyi, boş ikinci kısmı ve false döndürür
  • hash/maphash içindeki generic Hasher[T], bir değerin hash ve eşitlik stratejisini birlikte tanımlar
    • Eşit değerler mutlaka aynı hash’e sahip olmalıdır
    • Karşılaştırılabilir tipler için ComparableHasher[T] sunulur; büyük/küçük harfi yok sayan string gibi özel stratejiler de implement edilebilir
  • math/big.Int.Divide, bölüm ve kalanı birlikte hesaplarken Trunc, Floor, Round, Ceil arasından açıkça belirtilen yuvarlama yöntemini uygular
    • Yuvarlama yöntemine göre kalan da değiştiğinden, finans ve sayısal kodlarda mevcut Quo ve Mod’un 0 yönüne kırpma sınırlarını tamamlar
  • math/rand/v2.(*Rand).N, kendi *Rand kaynağından rastgele tamsayı veya duration tipleri için aralık sınırlı rastgele sayı üretir

Taşınabilir SIMD

  • Deneysel simd paketi, vektör boyutundan bağımsız SIMD API’si sağlar ve GOEXPERIMENT=simd ile etkinleştirilir
    • Desteklenen ortamlarda gerçek donanım vektör komutlarına derlenir; aksi halde saf Go emülasyonuna düşer
    • Float32s gibi tiplerin lane sayısı sabit değildir, makineye göre donanım genişliğini izler
  • Standart kütüphane hâlihazırda dahili simd/archsimd intrinsic’lerini kullanıyor
    • Swiss Table map’in MemHash32, MemHash64, StrHash fonksiyonları yeni SIMD temeliyle yeniden implemente edildi

Deterministik testler

  • testing/synctest.Sleep, sanal zamanı ilerletmeyi ve tüm goroutine’ler kararlı hale gelene kadar beklemeyi tek işlemde yapar
    • synctest bubble’ı içinde gerçek zaman akmaz; 2 saniyelik bekleme de anında tamamlanır
    • Mevcut time.Sleep ve synctest.Wait kombinasyonundaki tekrar eden kodların yerini alır
  • httptest.NewTestServer, gerçek TCP portu yerine bellek içi sanal ağ ile sunucu çalıştırır
    • srv.Client() process içindeki pipe üzerinden handler’a doğrudan bağlanır
    • t.Cleanup ile otomatik temizlendiği için defer srv.Close() gerekmez
    • testing/synctest ile birleştirildiğinde HTTP round-trip’leri de sanal zamanda hızlı ve deterministik olarak test edilebilir

Ağ ve uyumluluk değişiklikleri

  • time.After, time.NewTimer, time.NewTicker vb. tarafından döndürülen kanallar artık her zaman senkron arabelleksiz kanallar olur
    • Eski arabellek davranışını geri getiren asynctimerchan GODEBUG ayarı kaldırıldı
  • HTTP/1’de http.Response.Body.Close, bağlantının yeniden kullanılmasına yardımcı olmak için okunmamış gövdeyi ihtiyatlı bir sınıra kadar okur
    • Büyük indirmeleri erken sonlandırmak için Close’a güveniyorsanız, Transport.DisableKeepAlives ile yeniden kullanımı devre dışı bırakmalısınız
  • HTTP/2 sunucuları RFC 9218 istemci önceliklerini anlar ve yüksek öncelikli stream’lerden başlayarak işler
    • Server.DisableClientPriority = true ile eski round-robin davranışı geri getirilebilir
  • Windows ve macOS’ta crypto/x509.SystemCertPool, SSL_CERT_FILE ve SSL_CERT_DIR destekler
    • Değişkenler ayarlanmışsa diskteki kök sertifikaları okur ve platform API’si yerine Go doğrulayıcısını kullanır
    • GODEBUG=x509sslcertoverrideplatform=0 ile devre dışı bırakılabilir
  • Mevcut 12.226 satırlık oluşturulmuş h2_bundle.go dosyasında yer alan HTTP/2 implementasyonu, gerçek net/http/internal/http2 paketiyle değiştirildi
  • net/http içine henüz dışa açılmamış, takılabilir HTTP/3 hook’ları eklendi; test suit’inin bir kısmı HTTP/3 üzerinde çalışıyor
    • Çağrılabilir public API henüz yok, ancak gelecekteki QUIC tabanlı http.Transport için temel içeriyor

Araç zinciri

  • go test, go.mod içinde bildirilen Go sürümünden daha yeni standart kütüphane sembollerinin kullanımını bulan stdversion vet kontrolünü varsayılan olarak çalıştırır
  • go doc pkg@version ile belirli bir modül sürümünün dokümantasyonu görüntülenebilir
  • go doc -ex, çalıştırılabilir örnekleri listeler; örnek adı doğrudan belirtilirse kaynak kodunu yazdırır
  • go fix içine atomictypes, embedlit, slicesbackward, unsafefuncs modernizasyon analizörleri eklendi
    • waitgroup, waitgroupgo olarak yeniden adlandırıldı; fmtappendf kaldırıldı
  • Go 1.27 ve üstü modüllerde go mod tidy, dağınık require bloklarını doğrudan ve dolaylı bağımlılıklar için iki blok halinde birleştirirken yorumları korur
  • go tool trace -http=:6060, yalnızca port verilirse sadece localhost’a bind eder; dış erişim için adres açıkça belirtilmelidir
  • go komutu, Bazaar(bzr) sürüm kontrol sistemi desteğini kaldırdı
  • compile, link, asm, cgo, cover, pack, komut satırı uzunluğu sınırlarını aşmak için GCC biçimli yanıt dosyalarını (@file) destekler

Unicode ve güvenlik sınırı

  • Standart kütüphanenin Unicode verileri Unicode 15’ten Unicode 17’ye güncellendi
    • Unicode 16’da eklenen karakterler de sembol ve yazdırılabilir karakter olarak doğru sınıflandırılır
  • os.Root.ReadDir ve Readdir kullanarak root dışına kaçmaya izin veren sorun düzeltildi
  • Onaylanmamış //go:linkname kullanımı daha zor hale geldi
    • linknamestd yönergesi, yalnızca standart kütüphanenin içe aktarabileceği linkname’leri işaretler
    • Linker, assembly sembollerine linkname erişimini de kontrol ettiğinden, gayriresmî dahili sembollere bağımlı kodların erken test edilmesi gerekir

1 yorum

 
GN⁺ 2 시간 전
Lobste.rs yorumları
  • Tüm zamanların en iyi sürümü olabilir. SIMD, uuid, jsonv2 sonunda geldi

    • Tamamen geçiş yapabilmem için UUID v5 desteği de olmalı gibi
  • Konudan biraz sapıyor ama her şeyi string olarak ele alıp arayüz metotları arasındaki sözleşmeyi ve ilişkiyi dikkate almadığınızda hataların nasıl doğduğuna iyi bir örnek
    Equal büyük/küçük harfi yok sayıyor, ama Hash küçük harfe çevrilmiş değeri kullanıyor. Ancak EqualFold ile ToLower aynı eşitlik ilişkisini tanımlamıyor
    https://github.com/golang/go/issues/52204
    "\u017F" (ſ, uzun s) ile "s", EqualFold açısından aynı; fakat her birine ToLower uygulandığında sonuçlar farklı. Dolayısıyla "s" eklendikten sonra "ſ" eklenirse hash farklı olduğu için ayrı bir öğe olarak ekleniyor
    Daha da ilginci, dokümantasyonun tam da bu durum için uyarıda bulunması
    https://github.com/golang/go/…

  • Anton’un bıraktığı yerden başka birinin devam etmesi sevindirici

    • Ne yazık ki en azından bazı kısımlar, özellikle JSON v2’nin varsayılan kullanımı bölümü, LLM ile yazılmış gibi görünüyor. Üslubu hoşuma gitmiyor ama içerik yine de ilginç
    • Anton bırakmış gibi görünmüyor. 1.26’yı da yazdığına göre bu yazıyı muhtemelen başka biri önce yayımladı
  • Go’yu seviyorum ama her sürümde böyle özellikler eklemeye devam etmek için Go sözdiziminin yeterince zarif olup olmadığından emin değilim
    func (b Box[T]) Map[U any](f func(T) U) Box[U] {

    • Öznel bir konu ama bu özelliği destekleyen diğer dillerden daha kötü olduğunu düşünmüyorum. Zig en çok benzeyeni; Rust, TypeScript ve C++20 ise genel olarak tipi metot tanımlarının kapsayıcısı olarak kullanıp alıcı tipini birden çok metotta tekrar etme maliyetini azaltıyor
      Öte yandan Go ve Zig’deki uzun yazım, alıcı tanımını bulmak için başka bir yere kaydırma gereği olmaması açısından iyi. Tanım kısmından daha önemli sayılabilecek çağrı noktasında hepsi neredeyse aynı görünüyor ve tipi açıkça belirtmeye de gerek yok
  • Bir süredir Go’dan uzaktaydım; jsonv2 heyecan verici görünüyor. Ancak varsayılan olursa Go’nun uzun süredir koruduğu uyumluluk vaadini bozmuş olmaz mı diye merak ediyorum

    • jsonv2 ayrı bir yol olan encoding/json/v2 üzerinden içe aktarılmalı, yani bilinçli olarak seçmek gerekiyor. Mevcut encoding/json içeride v2’yi kullanıyor ama önceki davranışı garanti ediyor; jsonv2’de de v1’in istisnai davranışlarını yeniden üreten bayraklar bulunduğu için uyumluluk vaadi bozulmuyor
    • Go 1.26 projesinde v2’nin jsontext kütüphanesini kullanıyorum ve oldukça memnunum