deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Go 1.27'nin stdlib uuid paketi dört adımda google/uuid'nin yerini alıyor — bir de NULL tuzağı var

Go 1.27, v4 ve v7'yi kapsayan bir standart kütüphane uuid paketiyle geliyor. Bir dev.to rehberi, google/uuid'den geçişin dört adımını ve artık runtime'da hata veren nullable veritabanı kolonunu anlatıyor.

Go 1.27'nin stdlib uuid paketi dört adımda google/uuid'nin yerini alıyor — bir de NULL tuzağı var

Yeni paket neleri kapsıyor

19 Ağustos 2026'da yayımlanan Go 1.27, standart kütüphaneye bir uuid paketi ekledi; sürüm notları bunu tek satırda "UUID üretme ve ayrıştırma" olarak özetliyor. Bir dev.to rehberine göre import yolu yalnızca uuid ve API bilinçli olarak küçük tutulmuş, RFC 9562 üzerine kurulu: 16 baytlık bir dizinin taşıdığı, karşılaştırılabilir bir UUID tipi, genel kullanım için New(), 122 rastgele bitli NewV4() ve 48 bitlik milisaniye zaman damgasını en az 62 rastgele bitle eşleştiren NewV7(). Paketi Parse, MustParse, Nil() ve Max() tamamlıyor; yanlarında da String, Compare, MarshalText, UnmarshalText ve AppendText metotları var.

dev.to yazarı, Parse'ın google/uuid'nin kabul ettiği formların aynısını kabul ettiğini belirtiyor — tireli dizeler, süslü parantezli varyantlar, urn:uuid: öneki ve büyük-küçük harf farkı gözetmeksizin 32 çıplak onaltılık basamak — dolayısıyla veritabanlarında zaten saklanan değerler ayrıştırılmaya devam ediyor. Pakette olmayanlar ise sürüm 1, 3, 5 ve 6 yapıcıları, Version() ve Time() metotları, MarshalBinary ve bir NullUUID tipi. Yazı, yüzeyin neden bu kadar küçük kaldığının kaydı olarak golang/go#62026'da tartışılan ve kabul edilen öneriye işaret ediyor.

Önce go direktifini yükseltin

Göçün ilk adımı, herhangi bir import'a dokunmadan önce go mod edit -go=1.27 komutunu çalıştırmak. Derleyici, go.mod hâlâ go 1.26 beyan ederken uuid'yi import etmenize seve seve izin verir; ama Go 1.27, go test sırasında varsayılan olarak stdversion vet kontrolünü çalıştırır. dev.to yazısına göre bu kontrol, ilgili dosya için geçerli olan Go sürümünden daha yeni standart kütüphane sembollerini işaretler; bu sürüm de go direktifi ve dosyadaki build tag'leriyle belirlenir. Yani yükseltmeyi atlamak, go build başarılıyken go test'in hem yerelde hem CI'da başarısız olması demektir.

Kopmaları derleyiciye bırakın

Import uuid olarak değiştirildiğinde, modülü derlemek farkları ortaya çıkarır. Neredeyse her kod tabanında iki hata görülür: NewV7() artık UUID ve error yerine yalnızca UUID döndürüyor; Nil ve Max ise değişken değil fonksiyon olduğundan, uuid.Nil ile yapılan bir karşılaştırma parantezler eklenene kadar derlenmez. id.Time() veya id.Version()'a bel bağlayan kodun bunları yeniden uygulaması gerekir; ikisi de RFC 9562'de sabit bit konumlarıdır — sürüm 6. baytın yüksek yarım baytında, v7 zaman damgası ise milisaniye cinsinden ilk 48 bittedir.

Paket paket, bir dönüşümle göç edin

Büyük depoların tek seferde kapsamlı bir değişiklik yapması gerekmiyor. google/uuid ve standart kütüphane tipleri temel tip olarak [16]byte paylaştığından, aralarındaki doğrudan dönüşüm 16 baytı kopyalar ve başka hiçbir şey yapmaz; böylece paketler, birleşim noktasındaki küçük dönüşüm yardımcılarının ardında artımlı olarak göç edebilir. JSON çıktısı da değişmez, çünkü her iki uygulama da küçük harfli, tireli metin biçimine marshal eder. Yazar ayrıca NewV7 değerlerinin, sistem saati geriye gitmedikçe monoton arttığını ve Compare'ın big-endian baytlara göre sıraladığını vurguluyor; böylece uuid.UUID.Compare doğrudan slices.SortFunc içine yerleşir — saatler düzgün çalıştığı sürece, ayrı bir created_at sıralama anahtarı olmadan oluşturulma sırasını verir.

NULL tuzağı

İnce hata veritabanı kodunda yatıyor. Standart kütüphane tipi Scan veya Value metotları tanımlamıyor; ama Go 1.27'nin database/sql'i uuid.UUID'yi doğal olarak ele alıyor: varsayılan parametre dönüştürücü yazma işlemleri için dizgi biçimini üretiyor, Rows.Scan ise *uuid.UUID'yi desteklenen bir hedef olarak listeliyor ve bir UUID'nin dizgi temsilini ya da 16 baytlık bir dilimi kabul ediyor. Gerçek değerli satırlar değişmeden çalışıyor. NULL kolonlu satırlar çalışmıyor. google/uuid'nin Scan'ı nil kaynak için hedefi sessizce dokunulmaz bırakıyordu, yani yeni değişkenler uuid.Nil olarak kalıyordu; dev.to analizinin anlattığı gibi stdlib yolu ise NULL için genel bir "desteklenmeyen Scan" hatasına düşüyor ve boş dizeler için uuid.Parse içinde başarısız oluyor. Bunu derleme zamanında yakalayan hiçbir şey yok ve yalnızca alt satırları tohumlayan bir test paketi geçecek. Çözüm sql.Null[uuid.UUID] — genel sql.Null[T], Go 1.22'den beri yayımlanmış durumda — ona scan yapıp değeri yalnızca Valid true olduğunda kopyalamak.

Neden önemli

dev.to yazarı, github.com/google/uuid'nin Go servislerinin go.mod dosyalarında ne kadar yaygın olduğuna dikkat çekerek başlıyor ve son etiketli sürümü v1.6.0, Ocak 2024'e tarihleniyor. Yaygın v4 ve v7 durumları için standart kütüphaneli bir replacements, bağımlılık grafiğinden yaygın kullanılan bir harici bağımlılığı çıkarıyor; tedarik zinciri yüzeyini ve yükseltme karmaşasını azaltıyor. Göç çoğunlukla mekanik ve derleyici güdümlü; ama NULL tarama davranışındaki değişiklik, kod incelemesinden ve CI'dan sıyrılıp üretimde ilk değersiz satırda bozulan türden bir anlamsal fark — yazarın bunu bilerek test edilmesi gereken tek durum olarak öne çıkarmasının nedeni de tam olarak bu.

  • #golang
  • #go-1-27
  • #uuid
  • #standard-library
  • #dependencies