· kaynak dev.to (home feed)
Go 1.26 //go:fix inline, go fix'in kullanımdan kaldırılmış bir fonksiyonun tüm çağrılarını yeniden yazmasını sağlıyor
Go 1.26'da yeniden inşa edilen go fix bir kaynak seviyesi inliner içeriyor: kullanımdan kaldırılmış bir wrapper üzerine eklenen //go:fix inline direktifi, downstream modüllerdeki çağrılar dahil her çağrıyı otomatik olarak yeniden yazıyor.

Go 1.26 ile birlikte yeniden inşa edilen go fix
Gabriel Anhaia'nın dev.to'daki makalesine göre, makalede Şubat 2026 olarak tarihlenen Go 1.26, eski go fix düzelticilerini tamamen kaldırdı ve komutu go vet'i çalıştıran analiz çerçevesi üzerine yeniden inşa etti. Bunun pratik sonucu şu: go vet içinde bir sorumu işaretleyebilen her analiz aracı, artık bu onarımı go fix ile de uygulayabiliyor.
Paketle gelen analiz araçlarının çoğu modernleştirici: biri interface{} yerine any koyuyor, bir diğeri if/else zincirlerini min veya max çağrılarına dönüştürüyor. Makale, okuyucuları birincil dokümantasyon olarak Alan Donovan'ın iki Go blog yazısına — metinde 17 Şubat ve 10 Mart 2026 olarak tarihlenmiş — yönlendiriyor. Bir analiz aracı ayrılıyor: inline, bir kütüphane yazarının kendi API'sine eklediği //go:fix inline yorumunda kodladığı migrasyonu uygulayan araç.
Örnek durum ioutil.ReadFile; Go 1.16'dan beri os.ReadFile'ın tek satırlık bir wrapper'ı olan bu fonksiyonun Deprecated notu geçmişte yalnızca linter'ların şikayet etmesine yol açarken çağrı noktaları yerinde kalıyordu. Wrapper'a direktif eklendiğinde, go fix çalıştıran herkes bu çağrıların doğrudan os.ReadFile olarak — import dahil — yeniden yazıldığını görüyor.
Wrapper ince olmalı
Makaledeki örnek, eski FormatCents fonksiyonu Deprecated olarak işaretlenmiş ve //go:fix inline satırı eklenmiş bir money paketi. Kritik ayrıntı gövde: gövde, yerine geçecek olan Format'ı DefaultLocale ile çağırmaktan başka bir şey yapmamalı. Makalede alıntılanan inline analiz aracının kılavuzu, kullanımdan kaldırılmış fonksiyonların haleflerinin üzerinde ince wrapper'lar olarak yazılmasını öneriyor.
Inliner, wrapper'ın gövdesini her çağrı noktasına yapıştırarak çalışır; parametrelerin yerine argümanları koyar ve isimleri çağıran pakete göre niteler. Kullanımdan kaldırılmış fonksiyon kendi mantığını içeriyorsa araç yine de inline eder — ama her çağıran, yeni API'ye bir çağrı yerine o mantığın bir kopyasını alır; bu da migrasyonun amacını bozar. Önce wrapper'ı refactor edin, sonra direktifi ekleyin. Anhaia, örnek modülü kendisinin çalıştırmadığı konusunda açık; gösterdiği diff'ler doğrulanmış bir çalışmadan değil, inliner'ın belgelenmiş kurallarına dayanıyor.
Önce önizleyin, sonra uygulayın
Makaleye göre önerilen iş akışı şöyle: oluşan değişikliğin yalnızca go fix'in düzenlemelerini içermesi için temiz bir git ağacıyla başlayın. go fix -diff ./... ile önizleyin; yalnızca inliner'ı çalıştırmak ve modernleştiricileri atlamak için go fix -inline ./... kullanın, yine önizleme için -diff ile. Diff doğru göründüğünde -diff'i kaldırın; araç dosyaları yerinde yeniden yazar, ardından build alın, test edin, inceleyin ve commit edin.
Mekanizma modül sınırlarını aşıyor. Makalede alıntılanan analiz aracı dokümantasyonuna göre, diğer paketlerden yapılan çağrılar da işaretleniyor — böylece bir bağımlılığı yükselten ve go fix ./... çalıştıran bir downstream ekip, kendi deposunda migrasyonu gerçekleştirir; kütüphanenin bakımcılarından pull request gerekmez. Direktif, başka sabitleri alias'layan sabitlerde ve type alias'larda da çalışır; yeniden adlandırma ve taşıma tarzı migrasyonları kapsar.
Inliner'ın dokunmayacağı durumlar
Aracın tasarım kuralı, bir programın yaptığını asla değiştirmemesi gerektiğidir; bir yeniden yazmanın güvenli olduğunu kanıtlayamadığında ya daha hantal bir şeye geri düşer ya da hiçbir şey yapmaz. Makale üç durumu öne çıkarıyor:
Wrapper gövdesindeki export edilmemiş referanslar. Gövde küçük harfle başlayan bir tanımlayıcıdan bahsediyorsa, diğer paketlerdeki çağıranlar ona yasal olarak erişemez ve inliner yeniden yazmayı reddeder. Gövdenin dokunduğu her şey export edilmiş olmalıdır; aksi halde migrasyon yalnızca yazarın kendi paketi içinde çalışır.
Yan etkisi olan argümanlar. İkame, etkileri yeniden sıralayabileceği veya döngünün her iterasyonunda tekrarlayabileceği durumlarda inliner önce argümanı yeni bir değişkene bağlar ve inline edilen gövdede o değişkeni kullanır — doğru, ama bazen garip görünen bir sonuç. -inline.allow_binding_decl=false bayrağı bu çağrı noktalarını atlar.
Defer içeren gövdeler. Ertelenmiş bir çağrıyı çağıranın içine inline etmek, onu çağıran dönene kadar geciktirirdi. Gopls inliner bunu gövdeyi hemen çağrılan bir closure ile sararak çözer, ama go fix bu yeniden yazmaları reddeder; dolayısıyla defer kullanan bir wrapper kimseyi migrasyonla taşımaz.
Neden önemli
Bir Deprecated yorumu her zaman yalnızca bir tavsiyeydi ve tavsiye, birikmiş işler listesine yenik düşer. //go:fix inline bu tavsiyeyi çalıştırılabilir bir migrasyona dönüştürür: wrapper'a tek bir yorum, ve go fix çalıştıran her tüketici, el ile düzenleme olmadan yeni API'ye taşınır. Büyük Go kod tabanlarının bakımcıları için bu, bir API değişikliğinin maliyetini pek çok downstream öğleden sonrasından kütüphane tarafında tek seferlik bir refactor'a kaydırır. Kısıtlamalar — yalnızca export edilmiş referanslar, defer yok — ne yapabileceğini sınırlar, ama API'leri yeniden adlandırma, değiştirme ve taşıma gibi yaygın durumlar artık büyük ölçüde otomatikleştirilebilir.
- #golang
- #developer-tools
- #static-analysis
- #api-migration
- #deprecation