7 poin oleh GN⁺ 2026-02-18 | 1 komentar | Bagikan ke WhatsApp
  • 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 stringsbuilderfmt.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

 
GN⁺ 2026-02-18
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

    • PHP juga pernah punya upaya untuk membersihkan saran usang di Stack Overflow (misalnya magic_quotes)
      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
    • Kode konkurensi Go yang dihasilkan LLM sangat berbahaya
      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
    • Saya juga sering mengalami masalah seperti ini
      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
    • Penggunaan LLM pada akhirnya akan menghasilkan kode yang seragam dan biasa-biasa saja
    • Saya rasa gagasan menulis kode dengan LLM itu sendiri perlu ditinggalkan
      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

    • Di bahasa C ada Coccinelle, dan juga diperkenalkan dalam artikel LWN 2009
      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
    • clippy di Rust merekomendasikan sintaks terbaru dan sebagian juga bisa diperbaiki otomatis
      Berkat itu, kode menjadi jauh lebih rapi
    • hlint di Haskell juga sudah ada sejak lama
      Ia bisa mengganti concat dan map menjadi concatMap, atau menyederhanakan ekspresi if yang tidak perlu
    • Saya penasaran apakah ada yang pernah mentransformasikan codebase TypeScript dengan cara seperti ini
      Server 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

    • Sering kali saya ingin memakai bahasa lain, tetapi alat build, test, dan lint di Go terlalu bagus, jadi akhirnya kembali memakai Go
      Kecepatan kompilasinya juga luar biasa cepat
    • Dulu saya mencari dan memperbaiki loop for sendiri dengan regex, tetapi sekarang alat ini menanganinya dengan cara yang jauh lebih elegan
  • Tidak disebut di artikelnya, tetapi fitur favorit saya adalah directive //go:fix inline
    Directive 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 fix

  • Dalam 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 dimigrasikan
    housecat-inc/cheetah membagikan tool seperti ini
    Saya berencana menambahkan go fix ke loop cepat yang sudah mencakup go generate, go build, go test, dan go vet

    • Kecepatan kompilasi super cepat juga sangat menguntungkan untuk eksperimen iteratif dengan LLM
  • Saat 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

    • Go adalah bahasa yang cukup punya pendirian, jadi kebanyakan hal memang hanya punya satu cara
      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...of alih-alih forEach, dan jika dipakai bersama ultracite, workflow jadi jauh lebih mulus
    Di file agents.md saya tulis “jalankan biome fix setelah perubahan”, dan berkat itu kualitas kode terjaga otomatis
    Pengalamannya jauh lebih ringan dan efisien dibanding eslint