- 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/v2resmen sunuluyor; mevcutencoding/jsonda içeride v2 kullanıyor, ayrıca standart UUID paketi ve FIPS 204 tabanlı ML-DSA imzaları ekleniyorgoroutineleakprofili, traceback’te pprof etiketleri, sanal zaman içinsynctest.Sleepve 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:linknamekı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
- Embedded struct’larda yükseltilmiş alanlar
- 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=nosizespecializedmallocile 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
switchifadelerinifallthroughdahil lookup table olarak derliyor
- Deneysel
GOEXPERIMENT=mapsplitgroup, map gruplarının bellek yerleşiminiKVKVKVKVyerineKKKKVVVVyapıyor; varsayılan olarak kapalı - Linker, tip descriptor’larını ve itab’leri özel
.go.typebölümüne taşıyor;typelinksveitablinkskaldırılıyorreflect.typelinksoffset yerine tip döndürdüğü için, bu sembole//go:linknameile erişen kütüphaneler etkilenebilir
Goroutine tanılama ve profilleme
go.moddosyasında Go 1.27 veya üstünü kullanan modüller, traceback’teki goroutine başlığındaruntime/pprofetiketlerini gösterirpprof.Doile eklenen{request: 42}gibi bağlamlar crash dump,SIGQUITveruntime.Stackçıktısında görünür- Hassas etiketlerin traceback’te açığa çıkmaması için
GODEBUG=tracebacklabels=0kullanılmaya devam edilebilir
- Go 1.26’da deneysel olan goroutine sızıntı algılayıcı, resmi
goroutineleakprofiline 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/goroutineleakendpoint’i üzerinden toplanabilir;GOEXPERIMENTgerekmez
Kriptografi ve tanımlayıcılar
- Yeni crypto/mldsa paketi, FIPS 204’ün kuantum sonrası imza ML-DSA uygulamasını sağlar
MLDSA44,MLDSA65,MLDSA87adlı üç parametre seti anahtar/imza boyutu ile güvenlik seviyesi arasında denge kurarcrypto/x509içindeki anahtar ve imzalara, ayrıcacrypto/tlsiç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=jsonv2olmadan sunuluyor- Mevcut
encoding/jsonv1 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=nojsonv2ile özgün v1 implementasyonu geri getirilebilir - v2 performans için map anahtarlarını varsayılan olarak sıralamadığından, kararlı çıktı gerektiren testlerde
json.Deterministicbelirtilmelidir
- Mevcut
strings.CutLastvebytes.CutLast, değerleri son ayırıcıya göre böler- Ayırıcı yoksa tüm girdiyi, boş ikinci kısmı ve
falsedöndürür
- Ayırıcı yoksa tüm girdiyi, boş ikinci kısmı ve
hash/maphashiçindeki genericHasher[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 hesaplarkenTrunc,Floor,Round,Ceilarası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
QuoveMod’un 0 yönüne kırpma sınırlarını tamamlar
- Yuvarlama yöntemine göre kalan da değiştiğinden, finans ve sayısal kodlarda mevcut
math/rand/v2.(*Rand).N, kendi*Randkaynağı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=simdile etkinleştirilir- Desteklenen ortamlarda gerçek donanım vektör komutlarına derlenir; aksi halde saf Go emülasyonuna düşer
Float32sgibi 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/archsimdintrinsic’lerini kullanıyor- Swiss Table map’in
MemHash32,MemHash64,StrHashfonksiyonları yeni SIMD temeliyle yeniden implemente edildi
- Swiss Table map’in
Deterministik testler
testing/synctest.Sleep, sanal zamanı ilerletmeyi ve tüm goroutine’ler kararlı hale gelene kadar beklemeyi tek işlemde yaparsynctestbubble’ı içinde gerçek zaman akmaz; 2 saniyelik bekleme de anında tamamlanır- Mevcut
time.Sleepvesynctest.Waitkombinasyonundaki tekrar eden kodların yerini alır
httptest.NewTestServer, gerçek TCP portu yerine bellek içi sanal ağ ile sunucu çalıştırırsrv.Client()process içindeki pipe üzerinden handler’a doğrudan bağlanırt.Cleanupile otomatik temizlendiği içindefer srv.Close()gerekmeztesting/synctestile 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.NewTickervb. tarafından döndürülen kanallar artık her zaman senkron arabelleksiz kanallar olur- Eski arabellek davranışını geri getiren
asynctimerchanGODEBUG ayarı kaldırıldı
- Eski arabellek davranışını geri getiren
- 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.DisableKeepAlivesile yeniden kullanımı devre dışı bırakmalısınız
- Büyük indirmeleri erken sonlandırmak için
- HTTP/2 sunucuları RFC 9218 istemci önceliklerini anlar ve yüksek öncelikli stream’lerden başlayarak işler
Server.DisableClientPriority = trueile eski round-robin davranışı geri getirilebilir
- Windows ve macOS’ta
crypto/x509.SystemCertPool,SSL_CERT_FILEveSSL_CERT_DIRdestekler- 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=0ile devre dışı bırakılabilir
- Mevcut 12.226 satırlık oluşturulmuş
h2_bundle.godosyasında yer alan HTTP/2 implementasyonu, gerçeknet/http/internal/http2paketiyle değiştirildi net/httpiç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.Transportiçin temel içeriyor
- Çağrılabilir public API henüz yok, ancak gelecekteki QUIC tabanlı
Araç zinciri
go test,go.modiçinde bildirilen Go sürümünden daha yeni standart kütüphane sembollerinin kullanımını bulanstdversionvet kontrolünü varsayılan olarak çalıştırırgo doc pkg@versionile belirli bir modül sürümünün dokümantasyonu görüntülenebilirgo doc -ex, çalıştırılabilir örnekleri listeler; örnek adı doğrudan belirtilirse kaynak kodunu yazdırırgo fixiçineatomictypes,embedlit,slicesbackward,unsafefuncsmodernizasyon analizörleri eklendiwaitgroup,waitgroupgoolarak yeniden adlandırıldı;fmtappendfkaldırıldı
- Go 1.27 ve üstü modüllerde
go mod tidy, dağınıkrequireblokları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 belirtilmelidirgokomutu, 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.ReadDirveReaddirkullanarak root dışına kaçmaya izin veren sorun düzeltildi- Onaylanmamış
//go:linknamekullanımı daha zor hale geldilinknamestdyö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
Lobste.rs yorumları
Tüm zamanların en iyi sürümü olabilir. SIMD, uuid, jsonv2 sonunda geldi
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
Equalbüyük/küçük harfi yok sayıyor, amaHashküçük harfe çevrilmiş değeri kullanıyor. AncakEqualFoldileToLoweraynı eşitlik ilişkisini tanımlamıyorhttps://github.com/golang/go/issues/52204
"\u017F"(ſ, uzun s) ile"s",EqualFoldaçısından aynı; fakat her birineToLoweruygulandığında sonuçlar farklı. Dolayısıyla"s"eklendikten sonra"ſ"eklenirse hash farklı olduğu için ayrı bir öğe olarak ekleniyorDaha da ilginci, dokümantasyonun tam da bu durum için uyarıda bulunması
https://github.com/golang/go/…
https://github.com/golang/go/…
Anton’un bıraktığı yerden başka birinin devam etmesi sevindirici
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] {Ö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
encoding/json/v2üzerinden içe aktarılmalı, yani bilinçli olarak seçmek gerekiyor. Mevcutencoding/jsoniç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