- Di Go 1.26, diperkenalkan perintah
go fixyang 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, danstringscutuntuk mengubah kode yang berulang atau usang menjadi bentuk yang lebih modern - Untuk mendukung fitur baru
new(expr), ditambahkan analyzernewexpryang dapat menyederhanakan helper function sepertinewIntsecara otomatis go fixmemberikan 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 fixdiimplementasikan 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
-diffmemungkinkan pratinjau perubahan
- Perintah
- Daftar analyzer yang terdaftar dapat dilihat dengan
go tool fix help, dan mencakup berbagai aturan transformasi sepertiany,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
GOOSdanGOARCH
Modernizers — alat modernisasi kode
- Sejak generics diperkenalkan setelah Go 1.18, potensi penyederhanaan kode menjadi lebih besar
- Contoh: memakai
maps.Keysuntuk mengumpulkan key map, danstrings.Cutuntuk memisahkan string
- Contoh: memakai
- 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 fixdangoplsmeningkatkan keterbacaan kode sekaligus efek pembelajaran - Contoh modernizer:
- minmax: mengganti pernyataan
ifdengan fungsimin/max - rangeint: mengubah loop
for3-klausa menjadirange-over-int - stringscut: menyederhanakan kode berbasis
strings.Indexmenjadistrings.Cut
- minmax: mengganti pernyataan
Fitur new(expr) di Go 1.26
- Fungsi
newdiperluas agar menerima argumen nilai, sehingga inisialisasi dalam bentuknew("go1.26")menjadi mungkin - Analyzer
newexprmenemukan helper function sepertinewInt, menyederhanakannya menjadireturn new(x), lalu mengganti pemanggilannya menjadinew(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
minmaxditerapkan, muncul usulan transformasi tambahan - Optimasi beruntun seperti
stringsbuilder→fmt.Fprintfjuga dimungkinkan
- Contoh: setelah
go fixmenggunakan 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 vetdango fixdiintegrasikan agar berbagi framework analisis yang samavetberfokus pada deteksi kesalahan, sedangkanfixberfokus pada perbaikan otomatis yang aman
- Analyzer dapat dijalankan di berbagai driver seperti
unitchecker,multichecker,gopls,staticcheck, danTricorder - Sistem fact memungkinkan berbagi informasi antar-package
- Contoh: menyimpulkan bahwa
log.Printfadalah wrapper darifmt.Printf
- Contoh: menyimpulkan bahwa
goplsmenyediakan diagnosis real-time dan usulan perbaikan otomatis
Peningkatan infrastruktur analisis
- Perluasan package inspector meningkatkan efisiensi penelusuran AST, dengan tipe
Cursoryang 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 fixataugopls) - generalisasi pengecekan berbasis control flow, misalnya verifikasi invariant seperti “open lalu close” atau “lock lalu unlock”
- menjalankan analyzer kustom melalui dynamic loading (di dalam
- 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