- Di Go 1.26, diperkenalkan perintah
go fix yang sepenuhnya ditulis ulang, yang dapat meningkatkan kode secara otomatis dengan memanfaatkan fitur bahasa dan pustaka terbaru
- Alat ini mendeteksi pola kode melalui puluhan analyzer, lalu menerapkan berbagai modernizer seperti
minmax, rangeint, dan stringscut untuk mengubah kode yang berulang atau usang menjadi bentuk yang lebih modern
- Untuk mendukung fitur baru
new(expr), ditambahkan analyzer newexpr yang dapat menyederhanakan helper function seperti newInt secara otomatis
go fix memberikan efek sinergi saat dijalankan beberapa kali, karena analyzer yang berbeda dapat mengusulkan perbaikan secara berurutan, serta mencakup penggabungan otomatis saat terjadi konflik dan penghapusan import yang tidak diperlukan
- Tim Go berencana memperluasnya lewat paradigma analisis Self-service, agar developer dapat mendefinisikan dan mendistribusikan modernizer untuk API mereka sendiri
Gambaran umum perintah go fix
- Di Go 1.26,
go fix diimplementasikan ulang sepenuhnya untuk menyediakan kemampuan mengubah codebase secara otomatis ke gaya Go modern
- Perintah
go fix ./... memperbaiki semua package di direktori saat ini dan di bawahnya
- Opsi
-diff memungkinkan pratinjau perubahan
- Daftar analyzer yang terdaftar dapat dilihat dengan
go tool fix help, dan mencakup berbagai aturan transformasi seperti any, forvar, mapsloop, minmax, dan lainnya
- Untuk menjalankan hanya analyzer tertentu, gunakan flag seperti
-any; untuk mengecualikannya, tentukan -any=false
- Dengan mempertimbangkan perbedaan kode per platform, alat ini dapat dijalankan beberapa kali untuk tiap kombinasi
GOOS dan GOARCH
Modernizers — alat modernisasi kode
- Sejak generics diperkenalkan setelah Go 1.18, potensi penyederhanaan kode menjadi lebih besar
- Contoh: memakai
maps.Keys untuk mengumpulkan key map, dan strings.Cut untuk memisahkan string
- Untuk mengatasi masalah alat pembangkit kode berbasis LLM yang mempertahankan pola lama, ditekankan perlunya pembaruan kode open source yang mencerminkan idiom Go terbaru
- Modernizer yang disertakan dalam
go fix dan gopls meningkatkan keterbacaan kode sekaligus efek pembelajaran
- Contoh modernizer:
- minmax: mengganti pernyataan
if dengan fungsi min/max
- rangeint: mengubah loop
for 3-klausa menjadi range-over-int
- stringscut: menyederhanakan kode berbasis
strings.Index menjadi strings.Cut
Fitur new(expr) di Go 1.26
- Fungsi
new diperluas agar menerima argumen nilai, sehingga inisialisasi dalam bentuk new("go1.26") menjadi mungkin
- Analyzer
newexpr menemukan helper function seperti newInt, menyederhanakannya menjadi return new(x), lalu mengganti pemanggilannya menjadi new(expr)
- Hanya diterapkan jika versi minimum Go terpenuhi, misalnya directive
go 1.26
- Dapat diterapkan ke seluruh codebase dengan perintah
$ go fix -newexpr ./...
- Setelah digunakan, helper function yang tidak lagi diperlukan dapat diidentifikasi dengan alat
deadcode
Sinergi dan penanganan konflik
- Ada efek sinergi ketika satu perbaikan membuka peluang untuk perbaikan lain
- Contoh: setelah
minmax diterapkan, muncul usulan transformasi tambahan
- Optimasi beruntun seperti
stringsbuilder → fmt.Fprintf juga dimungkinkan
go fix menggunakan algoritme 3-way merge untuk menggabungkan konflik perbaikan secara otomatis
- Jika terjadi konflik sintaksis, perbaikan itu dilewati dan peringatan ditampilkan
- Konflik semantik, seperti penghapusan variabel atau import yang tak terpakai, memerlukan penyesuaian manual
- Import yang tidak diperlukan akan dihapus secara otomatis
Integrasi framework analisis Go
go vet dan go fix diintegrasikan agar berbagi framework analisis yang sama
vet berfokus pada deteksi kesalahan, sedangkan fix berfokus pada perbaikan otomatis yang aman
- Analyzer dapat dijalankan di berbagai driver seperti
unitchecker, multichecker, gopls, staticcheck, dan Tricorder
- Sistem fact memungkinkan berbagi informasi antar-package
- Contoh: menyimpulkan bahwa
log.Printf adalah wrapper dari fmt.Printf
gopls menyediakan diagnosis real-time dan usulan perbaikan otomatis
Peningkatan infrastruktur analisis
- Perluasan package inspector meningkatkan efisiensi penelusuran AST, dengan tipe
Cursor yang mendukung penelusuran atas, bawah, kiri, dan kanan
- Pengindeksan pemanggilan fungsi melalui typeindex meningkatkan kecepatan analisis hingga 1000 kali
- Peningkatan tambahan meliputi:
- penyediaan graf dependensi standard library
- dukungan kueri versi Go per file
- perluasan primitif refactoring agar modifikasi kode yang aman, seperti penanganan komentar, dimungkinkan
- Beberapa modernizer dikecualikan karena perubahan perilaku yang halus (
append([]string{}, slice...) → slices.Clone(slice))
- Ke depan direncanakan pengembangan mesin pattern matching, test harness otomatis, dan library operator perbaikan yang akurat
Paradigma Self-service
- Mulai Go 1.26, akan diperkenalkan model analisis Self-service
- Developer dapat mendefinisikan dan mendistribusikan modernizer untuk API mereka sendiri
- Dapat dijalankan di tingkat proyek tanpa prosedur persetujuan terpusat
- Sebagai tahap awal, fitur annotation-driven inliner disertakan dalam bentuk pratinjau
- Rencana ke depan:
- menjalankan analyzer kustom melalui dynamic loading (di dalam
go fix atau gopls)
- generalisasi pengecekan berbasis control flow, misalnya verifikasi invariant seperti “open lalu close” atau “lock lalu unlock”
- Tujuannya adalah meningkatkan efisiensi pemeliharaan dan mendukung adopsi cepat fitur Go terbaru
1 komentar
Komentar Hacker News
Saat asisten kode LLM menyebar cepat pada akhir 2024, menarik melihat bahwa alat-alat ini cenderung mereproduksi gaya kode Go lama dari data pelatihannya apa adanya
Bahkan ketika diminta memakai sintaks terbaru, kadang diabaikan, atau malah dibantah seolah itu tidak ada
Agar model ke depan mencerminkan idiom Go 1.25 terbaru, seluruh ekosistem kode open source perlu diperbarui ke gaya tersebut
Namun sekali data yang salah masuk ke LLM, hampir mustahil memperbaikinya
Sulit melacak dasar model mengambil kesimpulan, dan kita hanya bisa berharap itu diperbaiki di model generasi berikutnya
Terlihat sederhana sehingga lolos review, tetapi sebenarnya penanganan error dan edge case sering hilang
Setelah direview lalu dimasukkan lagi ke LLM, hasilnya tampak sudah diperbaiki, tetapi di dalamnya justru muncul data race atau deadlock
Ini masalah yang berulang di hampir semua model
Go punya kompatibilitas mundur yang baik sehingga tetap bisa dikompilasi, tetapi gaya kodenya jadi sangat berbeda
Pada Python, perubahan API benar-benar menyebabkan kerusakan kompatibilitas
Meski begitu, berkat stabilitas bahasa dan standard library, Go tetap sangat unggul sebagai bahasa untuk generasi kode
Seperti peringatan Rob Pike, teknologi semacam ini adalah polusi ekosistem perangkat lunak
Banyak orang menginginkan slop atas nama ‘kemudahan’, dan itulah inti masalahnya
Alat yang bisa otomatis mengubah source code ke gaya terbaru benar-benar keren
OpenRewrite di Java adalah contoh yang paling menonjol, tetapi untuk bahasa lain tidak banyak yang langsung teringat
Jika seperti Go fitur ini tertanam di dalam bahasanya, kematangan bahasa meningkat besar
Sepertinya bahasa-bahasa baru ke depan akan mencontoh pendekatan terintegrasi ala Go ini
IDE JetBrains bisa melakukan refactoring pada jutaan baris kode sekaligus atau mengonversinya otomatis ke sintaks baru
Ada juga fitur seperti ConvertToPrimaryConstructor
Selain itu, Structural Search and Replace bekerja pada level sintaks bahasa, bukan sekadar teks biasa
Analyzer Roslyn di .NET juga memberi saran perbaikan kode di IDE
Link tutorial
Berkat itu, kode menjadi jauh lebih rapi
Ia bisa mengganti
concatdanmapmenjadiconcatMap, atau menyederhanakan ekspresiifyang tidak perluServer LSP fiturnya kurang, bahkan refactoring dasar seperti menghapus argumen pun tidak didukung
Saya sedang mempertimbangkan apakah kombinasi jscodeshift dan Claude bisa dipakai
Berkat alat auto-fix (go fix) seperti ini, Go benar-benar bahasa yang luar biasa
Fitur baru rangeint juga kabarnya akan diterapkan otomatis lewat go fix, jadi sangat dinantikan
Salut untuk tim Go
Kecepatan kompilasinya juga luar biasa cepat
forsendiri dengan regex, tetapi sekarang alat ini menanganinya dengan cara yang jauh lebih eleganTidak disebut di artikelnya, tetapi fitur favorit saya adalah directive
//go:fix inlineDirective ini menyisipkan fungsi satu baris secara inline ke pemanggilnya
Ini memungkinkan pembuat library melakukan migrasi otomatis dari fungsi lama ke versi baru secara mulus
Bahkan jika semver berubah, upgrade otomatis tetap bisa dilakukan dengan
go fixDalam podcast Wes McKinney yang baru saya tonton,
dia mengatakan bahwa Go ideal untuk coding agent berkat siklus compile-run yang cepat, sistem tipe yang kuat, dan keamanan multithread
Mendengar itu membuat saya tertarik lagi pada Go
Ekosistem tooling dan konvensi Go yang sudah mapan sangat membantu pengembangan berbasis agen
Dengan
go run main.go, environment pengembangan bisa langsung dijalankan, dan ini juga mendukung banyak worktree, konfigurasi terpusat, sampai DB yang sudah dimigrasikanhousecat-inc/cheetah membagikan tool seperti ini
Saya berencana menambahkan
go fixke loop cepat yang sudah mencakupgo generate,go build,go test, dango vetSaat belajar Python, saya merasa ada terlalu banyak cara untuk melakukan hal yang sama dan semuanya tidak konsisten
Kadang saya malah merindukan pendekatan seperti C yang hanya punya satu cara
Saya jadi penasaran apakah Go sudah sampai ke tahap itu
Saya ingin tahu apakah ini bahasa yang memungkinkan mengikuti best practice tanpa bantuan LLM
Kesan terbesarnya adalah upaya menjaga semuanya tetap sederhana, tanpa menjadi kompleks
Saya merekomendasikannya untuk orang yang lelah dengan kebingungan di Python
Konsep self-service analyzer benar-benar menarik
Rasanya ini akan dipakai secara aktif oleh library besar atau tim infrastruktur
Kalau ada alat seperti ini, jadi terpikir apakah bahasa yang tidak punya kompatibilitas mundur pun sebenarnya bisa tetap layak dipakai
Di ekosistem TypeScript, biome memainkan peran seperti ini
Misalnya ia merekomendasikan
for...ofalih-alihforEach, dan jika dipakai bersama ultracite, workflow jadi jauh lebih mulusDi file
agents.mdsaya tulis “jalankan biome fix setelah perubahan”, dan berkat itu kualitas kode terjaga otomatisPengalamannya jauh lebih ringan dan efisien dibanding eslint