Compiler Go terkenal galak: variabel tak terpakai, import menganggur, dan konversi implisit semuanya ditolak sebelum program sempat berjalan. Kekerasan ini disengaja agar kesalahan ketangkapan tertangkap di meja pengembang, bukan di produksi. Mesin pesannya sendiri cukup informatif — setiap error diawali posisi berkas:baris:kolom lalu deskripsi masalahnya — tetapi redaksinya kadang asing bagi pemula. Chapter ini menyusun kamus pesan yang paling sering muncul; seluruh teks pesan dikutip asli dari eksekusi sungguhan pada Go 1.27.2, bukan dari ingatan buku lama, karena redaksi modern kerap berbeda.
Format dan Cara Membacanya #
Baris pertama keluaran seperti # command-line-arguments adalah nama paket yang gagal dikompilasi. Baris berikut berformat ./berkas.go:4:2: pesan — berkas, baris ke-4, kolom ke-2, lalu isi pesan. Biasakan membaca error pertama lebih dulu karena pesan sesudahnya sering kali hanya akibat berantainya. Dua contoh berikut dijalankan sungguhan; simpan masing-masing potongan sebagai berkas lalu jalankan go run.
Contoh Nyata 1: Variabel Tak Terpakai #
package main
func main() {
x := 10
}go run variabel-tak-dipakai.goOutput yang Dihasilkan:
# command-line-arguments
./variabel-tak-dipakai.go:4:2: declared and not used: xPesan menunjuk baris 4 kolom 2 — tepat posisi x. Mari kita telaah kedua sisi kejadian ini:
- Baris 4 (
x := 10): variabelxdideklarasikan dan diisi, tetapi tidak pernah dibaca pada baris mana pun setelahnya. - Baris keluaran (
declared and not used: x): compiler menolak variabel lokal yang dibiarkan karena kebijakan Go memperlakukan kode mati sebagai kesalahan, bukan peringatan. - Solusi: gunakan
xdalam ekspresi apa pun, hapus baris deklarasinya, atau ganti nama menjadi blank identifier_bila nilai memang tidak dibutuhkan.
Contoh Nyata 2: Tidak Ada Konversi Implisit #
package main
import "fmt"
func main() {
var angka int = 7
var teks string = angka
fmt.Println(teks)
}go run salah-tipe.goOutput yang Dihasilkan:
# command-line-arguments
./salah-tipe.go:7:20: cannot use angka (variable of type int) as string value in variable declarationPesan Go modern menjelaskan dirinya sendiri: angka diketahui variable of type int, nilai 7, dan ditolak sebagai string value pada deklarasi variabel. Mari kita telaah kenapa compiler menolaknya:
- Baris 6 (
var angka int = 7): variabelangkasah — literal 7 memang bertipeint. - Baris 7 (
var teks string = angka): inilah baris yang ditunjuk pesan;angkasudah variable of type int, bukan lagi konstanta bebas tipe, sehingga tidak bisa dianggapstringbegitu saja. - Solusi: Go tidak pernah mengonversi tipe secara implisit — ubah menjadi
var teks string = strconv.Itoa(angka)dengan importstrconv, atau tetap bekerja dalam satu tipe.
Kamus Pesan yang Umum #
Tabel berikut memuat 22 pesan yang paling sering ditemui pemula. Kolom Pesan dikutip persis dari keluaran compiler Go 1.27.2; teks dalam kurung menyesuaikan kode pemicu Anda.
| Pesan | Penyebab | Solusi |
|---|---|---|
declared and not used: x | Variabel lokal dideklarasikan tetapi tak pernah dipakai | Pakai variabelnya, hapus, atau ganti nama menjadi _ |
"fmt" imported and not used | Package diimpor tanpa ada simbol yang dipakai | Hapus baris import atau gunakan salah satu simbolnya |
undefined: halo | Nama dipakai tanpa deklarasi atau tanpa import | Periksa ejaan, scope deklarasi, dan path import |
syntax error: unexpected EOF, expected } | Kurung kurawal tidak seimbang | Cek pasangan { dan }; jalankan gofmt untuk melihat titik aneh |
cannot use 42 (untyped int constant) as string value in variable declaration | Nilai literal tak cocok dengan tipe deklarasi | Konversi eksplisit, mis. strconv.Itoa(42) |
missing return | Fungsi berbalik nilai memiliki jalur tanpa return | Tutup semua jalur atau ubah desain fungsi |
not enough arguments in call to jumlah | Argumen kurang dari parameter; diikuti baris have (...) dan want (...) | Lengkapi argumen sesuai signature |
too many arguments in call to jumlah | Argumen lebih banyak daripada parameter | Hapus argumen berlebih |
invalid operation: 1 + "dua" (mismatched types untyped int and untyped string) | Dua operand bertipe berbeda pada satu operator | Konversi salah satu operand agar tipenya sama |
cannot assign to s[0] (neither addressable nor a map index expression) | String immutable; elemennya tak bisa diubah di tempat | Bangun string baru dengan slicing dan penggabungan |
assignment mismatch: 2 variables but 1 value | Jumlah variabel tak sama dengan nilai di sisi kanan | Sesuaikan jumlah variabel dan nilai |
main redeclared in this block | Dua deklarasi main pada paket yang sama | Hapus atau gabungkan; satu paket hanya boleh satu main |
no new variables on left side of := | := dipakai tanpa ada variabel baru | Ganti operator menjadi = bila memang penugasan ulang |
goto selesai jumps over declaration of nilai at ./goto-lompat.go:7:8 | goto melompati deklarasi variabel di tengah jalur | Deklarasikan sebelum goto atau pindahkan label |
goto dalam jumps into block starting at ./goto-blok.go:5:2 | goto masuk ke dalam blok dari luar blok | Pindahkan label ke level blok luar |
cannot fallthrough final case in switch | fallthrough berada pada case terakhir | Hapus fallthrough — tidak ada case berikutnya |
cannot use 200 (untyped int constant) as int8 value in variable declaration (overflows) | Konstanta di luar rentang tipe | Perbesar tipe (mis. int16) atau perkecil nilai |
invalid operation: not enough arguments for len() (expected 1, found 0) | Fungsi bawaan dipanggil tanpa argumen cukup | Sertakan argumen sesuai jumlah yang diminta |
p.Name undefined (type Pengguna has no field or method Name) | Field atau method tidak ditemukan pada tipe | Periksa ejaan field dan besar-kecil huruf (ekspor) |
cannot range over 1.5 (untyped float constant) | range diberikan nilai yang tak dapat diiterasi | range hanya untuk integer, string, slice, map, channel |
x redeclared in this block | Nama sama dideklarasikan dua kali dalam satu blok | Ubah nama salah satu deklarasi |
interface method must have no type parameters | Method pada interface memiliki type parameter sendiri | Pindahkan type parameter ke deklarasi interface (generics) |
Praktik membaca pesan berantai dan membedakan error versus go vet warning dibahas pada chapter Membaca Compiler Error
, sedangkan kebiasaan mengurai pesan sejak program pertama dimulai di Membaca Pesan Error
.
Referensi #
- Spesifikasi Go — aturan bahasa yang ditegakkan pesan-pesan di atas.
- Diagnostics Go — ringkasan resmi pesan compiler, vet, dan runtime panic.
Dengan kamus error di tangan, rujukan terakhir yang tersisa adalah kamus istilah: seluruh kosakata ekosistem Go dirangkum pada chapter Glossary .