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:
golangci-lint run ./...Contoh tampilan keluarannya (ilustrasi — bukan hasil eksekusi pada lingkungan ini) pada program uji chapter staticcheck:
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:
version: "2"
linters:
default: standard
enable:
- errcheck
- misspell
- gosec
- revive
exclusions:
rules:
- path: _test\.go
linters:
- errcheck
formatters:
enable:
- gofmt
- goimportsMari kita bedah tiap bagian konfigurasi di atas:
version: "2": penanda format konfigurasi golangci-lint v2 — berkas tanpa baris ini dibaca sebagai format lama.default: standard: kumpulan linter bawaan — di antaranya govet, staticcheck, unused, dan ineffassign — menjadi dasar.enable:: daftar linter tambahan yang diaktifkan di atas himpunan bawaan.exclusions.rules: berkas_test.godibebaskan dari errcheck karena test kerap sengaja mengabaikan error pada jalur gagal.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 #
| Linter | Fokus pemeriksaan |
|---|---|
govet | Pola mencurigakan — pembungkus go vet dari chapter sebelumnya |
staticcheck | Bug, penyederhanaan, dan kode mati (SA, S, ST, U) |
unused | Deklarasi yang tidak pernah diakses |
errcheck | Nilai error yang dibiarkan tanpa diperiksa |
ineffassign | Penugasan yang hasilnya tidak pernah dibaca |
gosec | Masalah keamanan misalnya path traversal dan SHA1 |
revive | Gaya dan penamaan, penerus golint |
misspell | Kesalahan 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 #
- golangci-lint — dokumentasi resmi — instalasi, daftar linter, dan format konfigurasi v2.
- staticcheck — situs resmi — salah satu linter utama yang diagregasi.