Ketika sebuah tim memasang staticcheck, errcheck, gosec, dan misspell sekaligus, empat binary harus diinstal, diperbarui, dan dijalankan terpisah dengan empat format keluaran yang berbeda. Perintah golangci-lint menyederhanakan kekacauan ini: satu binary yang mengagregasi puluhan linter Go populer, menjalankannya paralel di atas cache kompilasi bersama, lalu meringkas temuan dalam satu format. Pada chapter ini kita akan mempelajari konfigurasi .golangci.yaml yang menjaga proyek tetap terkendali, memahami daftar linter yang biasa diaktifkan, dan menempatkan golangci-lint di dalam workflow. Perlu diketahui sejak awal: seluruh perintah dan keluaran pada chapter ini adalah contoh konfigurasi dan ilustrasi — binary golangci-lint sengaja tidak diinstal pada lingkungan penulisan karena ukurannya besar.

Satu Perintah untuk Semua Linter #

golangci-lint membungkus linter-linter yang telah kita bahas — go vet lewat linter govet, staticcheck lewat linter staticcheck — plus puluhan lainnya. Keunggulan arsitekturnya ada pada tiga hal: hasil antar-linter digabung dalam satu format berkas:baris:kolom: pesan (linter), linter berjalan paralel berbagi cache parsing sehingga total waktunya jauh lebih pendek daripada menjalankan tiap binary terpisah, dan satu berkas konfigurasi .golangci.yaml mengatur seluruh perilaku. golangci-lint sendiri populer sebagai linter bawaan di banyak proyek Go skala besar.

Perintah intinya sederhana:

bash
golangci-lint run ./...

Contoh tampilan keluarannya (ilustrasi — bukan hasil eksekusi pada lingkungan ini) pada program uji chapter staticcheck:

text
sederhana.go:6:5: S1002: should omit comparison to bool constant, can be simplified to member (staticcheck)
sederhana.go:12:6: U1000: func rasioDiskon is unused (unused)
main.go:21:9: Error return value is not checked (errcheck)

Setiap baris memuat lokasi persis, pesan dari linter asalnya, dan nama linter asalnya dalam tanda kurung di akhir baris. Flag --fix meminta golangci-lint menerapkan perbaikan otomatis untuk temuan yang mendukungnya, dan subperintah golangci-lint fmt ./... menjalankan pemformat (gofmt, goimports) yang ikut teragregasi sejak versi 2.

Konfigurasi .golangci.yaml #

golangci-lint membaca berkas .golangci.yaml di akar module. Contoh konfigurasi berikut mengikuti format golangci-lint versi 2 dan merepresentasikan kebutuhan umum: sekumpulan linter wajar aktif, beberapa pengecualian untuk berkas test, serta pemformat yang dijaga tetap rapi:

yaml
version: "2"

linters:
  default: standard
  enable:
    - errcheck
    - misspell
    - gosec
    - revive
  exclusions:
    rules:
      - path: _test\.go
        linters:
          - errcheck

formatters:
  enable:
    - gofmt
    - goimports

Mari kita bedah tiap bagian konfigurasi di atas:

  1. version: "2": penanda format konfigurasi golangci-lint v2 — berkas tanpa baris ini dibaca sebagai format lama.
  2. default: standard: kumpulan linter bawaan — di antaranya govet, staticcheck, unused, dan ineffassign — menjadi dasar.
  3. enable:: daftar linter tambahan yang diaktifkan di atas himpunan bawaan.
  4. exclusions.rules: berkas _test.go dibebaskan dari errcheck karena test kerap sengaja mengabaikan error pada jalur gagal.
  5. formatters.enable: gofmt dan goimports dijalankan lewat golangci-lint, sehingga pemeriksaan gaya terpusat.

Konfigurasi dapat diverifikasi tanpa menjalankan linter penuh dengan perintah golangci-lint config verify.

Linter yang Sering Ditemui #

LinterFokus pemeriksaan
govetPola mencurigakan — pembungkus go vet dari chapter sebelumnya
staticcheckBug, penyederhanaan, dan kode mati (SA, S, ST, U)
unusedDeklarasi yang tidak pernah diakses
errcheckNilai error yang dibiarkan tanpa diperiksa
ineffassignPenugasan yang hasilnya tidak pernah dibaca
gosecMasalah keamanan misalnya path traversal dan SHA1
reviveGaya dan penamaan, penerus golint
misspellKesalahan ejaan Inggris pada komentar

Daftar lengkap dengan status aktif/Nonaktif tersedia di dokumentasi resmi golangci-lint. Tim disarankan memulai dari himpunan standard, lalu mengaktifkan linter tambahan satu per satu disertai perbaikan temuan — mengaktifkan dua puluh linter sekaligus di proyek lama hanya menghasilkan gunungan temuan yang tidak selesai dibereskan.

Menempatkan golangci-lint dalam Workflow #

Dua titik integrasi paling umum: menjalankan golangci-lint run ./... secara lokal sebelum commit (banyak editor menampilkannya langsung lewat gopls atau plugin), dan menjalankannya di server CI pada setiap pull request. Untuk GitHub Actions tersedia action resmi golangci/golangci-lint-action sehingga instalasi binary tidak perlu ditulis manual — konfigurasi lengkapnya akan kita susun di chapter Continuous Integration .

Sampai di sini rantai kualitas per kode sudah tersambung: format rapi, import bersih, vet lulus, lint teragregasi. Rantai berikutnya mengurus sesuatu yang lebih jarang disentuh namun menentukan kesehatan proyek jangka panjang — dokumentasi package dengan konvensi godoc dan perintah go doc.

Referensi #