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 #

go
package main

func main() {
        x := 10
}
bash
go run variabel-tak-dipakai.go

Output yang Dihasilkan:

text
# command-line-arguments
./variabel-tak-dipakai.go:4:2: declared and not used: x

Pesan menunjuk baris 4 kolom 2 — tepat posisi x. Mari kita telaah kedua sisi kejadian ini:

  1. Baris 4 (x := 10): variabel x dideklarasikan dan diisi, tetapi tidak pernah dibaca pada baris mana pun setelahnya.
  2. Baris keluaran (declared and not used: x): compiler menolak variabel lokal yang dibiarkan karena kebijakan Go memperlakukan kode mati sebagai kesalahan, bukan peringatan.
  3. Solusi: gunakan x dalam ekspresi apa pun, hapus baris deklarasinya, atau ganti nama menjadi blank identifier _ bila nilai memang tidak dibutuhkan.

Contoh Nyata 2: Tidak Ada Konversi Implisit #

go
package main

import "fmt"

func main() {
        var angka int = 7
        var teks string = angka
        fmt.Println(teks)
}
bash
go run salah-tipe.go

Output yang Dihasilkan:

text
# command-line-arguments
./salah-tipe.go:7:20: cannot use angka (variable of type int) as string value in variable declaration

Pesan 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:

  1. Baris 6 (var angka int = 7): variabel angka sah — literal 7 memang bertipe int.
  2. Baris 7 (var teks string = angka): inilah baris yang ditunjuk pesan; angka sudah variable of type int, bukan lagi konstanta bebas tipe, sehingga tidak bisa dianggap string begitu saja.
  3. Solusi: Go tidak pernah mengonversi tipe secara implisit — ubah menjadi var teks string = strconv.Itoa(angka) dengan import strconv, 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.

PesanPenyebabSolusi
declared and not used: xVariabel lokal dideklarasikan tetapi tak pernah dipakaiPakai variabelnya, hapus, atau ganti nama menjadi _
"fmt" imported and not usedPackage diimpor tanpa ada simbol yang dipakaiHapus baris import atau gunakan salah satu simbolnya
undefined: haloNama dipakai tanpa deklarasi atau tanpa importPeriksa ejaan, scope deklarasi, dan path import
syntax error: unexpected EOF, expected }Kurung kurawal tidak seimbangCek pasangan { dan }; jalankan gofmt untuk melihat titik aneh
cannot use 42 (untyped int constant) as string value in variable declarationNilai literal tak cocok dengan tipe deklarasiKonversi eksplisit, mis. strconv.Itoa(42)
missing returnFungsi berbalik nilai memiliki jalur tanpa returnTutup semua jalur atau ubah desain fungsi
not enough arguments in call to jumlahArgumen kurang dari parameter; diikuti baris have (...) dan want (...)Lengkapi argumen sesuai signature
too many arguments in call to jumlahArgumen lebih banyak daripada parameterHapus argumen berlebih
invalid operation: 1 + "dua" (mismatched types untyped int and untyped string)Dua operand bertipe berbeda pada satu operatorKonversi 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 tempatBangun string baru dengan slicing dan penggabungan
assignment mismatch: 2 variables but 1 valueJumlah variabel tak sama dengan nilai di sisi kananSesuaikan jumlah variabel dan nilai
main redeclared in this blockDua deklarasi main pada paket yang samaHapus atau gabungkan; satu paket hanya boleh satu main
no new variables on left side of :=:= dipakai tanpa ada variabel baruGanti operator menjadi = bila memang penugasan ulang
goto selesai jumps over declaration of nilai at ./goto-lompat.go:7:8goto melompati deklarasi variabel di tengah jalurDeklarasikan sebelum goto atau pindahkan label
goto dalam jumps into block starting at ./goto-blok.go:5:2goto masuk ke dalam blok dari luar blokPindahkan label ke level blok luar
cannot fallthrough final case in switchfallthrough berada pada case terakhirHapus fallthrough — tidak ada case berikutnya
cannot use 200 (untyped int constant) as int8 value in variable declaration (overflows)Konstanta di luar rentang tipePerbesar tipe (mis. int16) atau perkecil nilai
invalid operation: not enough arguments for len() (expected 1, found 0)Fungsi bawaan dipanggil tanpa argumen cukupSertakan argumen sesuai jumlah yang diminta
p.Name undefined (type Pengguna has no field or method Name)Field atau method tidak ditemukan pada tipePeriksa ejaan field dan besar-kecil huruf (ekspor)
cannot range over 1.5 (untyped float constant)range diberikan nilai yang tak dapat diiterasirange hanya untuk integer, string, slice, map, channel
x redeclared in this blockNama sama dideklarasikan dua kali dalam satu blokUbah nama salah satu deklarasi
interface method must have no type parametersMethod pada interface memiliki type parameter sendiriPindahkan 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 .