Go 1.26'nın yeni özelliği: //go:fix inline ile kaynak seviyesinde inlining
Go 1.26'daki go fix aracı ve //go:fix inline direktifi, API göçlerini otomatikleştiren kaynak seviyesi inliner'ı tanıtıyor. Detaylar devrazzi'de.
Go 1.26 ile birlikte gelen yeni go fix komutu, geliştiricilere kod tabanlarını modern API'lere taşımada yardımcı olacak bir kaynak seviyesi inliner sunuyor. 2023'te geliştirilen bu algoritma, bir fonksiyon çağrısını çağrılan fonksiyonun gövdesiyle değiştirerek kodu kalıcı olarak dönüştürüyor; bu yönüyle derleyicinin geçici ara temsilde yaptığı klasik inlining'den ayrışıyor. gopls'in 'Inline call' refactoring özelliği de aynı motoru kullanıyor.
//go:fix inline yorum direktifi, paket yazarlarının eski ve deprecated API'leri yeni karşılıklarına yönlendirmesini sağlıyor. Örneğin ioutil.ReadFile fonksiyonuna bu direktif eklendiğinde, go fix çalıştırıldığında tüm çağrılar otomatik olarak os.ReadFile'a dönüştürülüyor. Yöntem sadece yeniden adlandırmayla sınırlı değil; parametre sırası yanlış tasarlanmış fonksiyonlar veya gereksiz API'ler gibi tasarım hatalarını da forwarding fonksiyonlar ve inline direktifleriyle düzeltmek mümkün. Tip takma adları ve sabitler için de aynı mekanizma geçerli.
Bu yaklaşım, gofmt -r gibi keyfi yeniden yazma araçlarından farklı olarak, çağrıyı rastgele bir ifadeyle değil doğrudan çağrılan fonksiyonun gövdesiyle değiştirdiği için davranışı koruma garantisi sunuyor (çağrı yığınını inceleyen kod hariç). Google'da benzer inliner araçları Java, Kotlin ve C++ ekiplerinde yıllardır kullanılıyor ve milyonlarca deprecated çağrıyı temizlemiş durumda; Go'nun inliner'ı ise şimdiden 18.000'den fazla değişiklik listesi hazırlamış.
Motorun kendisi yaklaşık 7.000 satırlık, derleyici benzeri karmaşık bir mantığa sahip. Parametre elemesi gibi ince detaylar, doğru ve güvenli bir dönüşüm sağlamak için özenle ele alınıyor. Bu özellik, kütüphane bakımcılarına API göçlerini kullanıcı tarafında otomatikleştirme imkanı tanıyarak, büyük ölçekli Go kod tabanlarının modernizasyonunu kolaylaştırıyor.