Pesan error bukan musuh yang harus ditakuti, melainkan umpan balik paling jujur dari compiler. Compiler Go terkenal berusaha berbicara spesifik: hampir setiap pesan menunjuk lokasi persis sampai kolom, lalu menjelaskan apa yang salah. Keterampilan membaca pesan tersebut menentukan seberapa cepat kita kembali menulis kode. Pada chapter penutup section ini, kita sengaja membuat tiga program yang gagal dikompilasi, menjalankannya satu per satu, dan membedah setiap pesan error yang muncul hingga tuntas.
Anatomi Sebuah Pesan Error #
Seluruh pesan error compiler Go memakai pola yang sama: lokasi berkas, nomor baris, nomor kolom, lalu isi pesannya. Ambil contoh hasil nyata dari kasus pertama kita di bawah:
./error-unused.go:6:2: declared and not used: pesanPesan tersebut terurai menjadi tiga bagian:
| Bagian | Nilai pada contoh | Arti |
|---|---|---|
| Berkas | ./error-unused.go | Berkas yang bermasalah, relatif terhadap direktori aktif |
| Baris dan kolom | 6:2 | Baris ke-6, kolom ke-2, posisi persis masalahnya |
| Isi pesan | declared and not used: pesan | Penjelasan masalah dari compiler |
Kolom dihitung per karakter sejak awal baris, dimulai dari angka 1. Ketika kita menjalankan berkas secara langsung, output juga diawali baris # command-line-arguments, yaitu nama package sementara yang dibentuk go run untuk berkas-berkas tersebut. Baris header ini hanya konteks, bukan bagian dari pesan errornya.
Kasus 1: Variabel Dideklarasikan tetapi Tidak Dipakai #
Berkas error-unused.go pada folder chapter ini mendeklarasikan variabel pesan yang tidak pernah dipakai:
package main
import "fmt"
func main() {
pesan := "Halo, Budi!"
fmt.Println("Pesan sudah disiapkan")
}Jalankan berkas tersebut dan amati penolakan compiler:
go run error-unused.goOutput yang Dihasilkan:
# command-line-arguments
./error-unused.go:6:2: declared and not used: pesanLokasi 6:2 menunjuk tepat awal nama pesan pada baris keenam. Isi pesannya lugas: variabel pesan dideklarasikan, tetapi tidak digunakan di mana pun. Go menolak variabel nganggur karena variabel semacam itu hampir selalu tanda kekeliruan, misalnya nilai yang disimpan lalu dilupakan. Ada dua perbaikan yang sah: pakai variabel tersebut, misalnya mengganti statement cetak menjadi fmt.Println(pesan), atau hapus baris deklarasinya sama sekali.
Kasus 2: Identifier yang Tidak Dikenal #
Berkas error-undefined.go memuat kesalahan ketik klasik: pesann dengan dua n:
package main
import "fmt"
func main() {
fmt.Println(pesann)
}Jalankan berkas tersebut:
go run error-undefined.goOutput yang Dihasilkan:
# command-line-arguments
./error-undefined.go:6:14: undefined: pesannKolom 14 menunjuk huruf pertama pesann, tepat di dalam tanda kurung fmt.Println(...). Pesan undefined: pesann berarti compiler tidak menemukan deklarasi apa pun dengan nama pesann di seluruh package. Penyebab paling umum adalah salah ketik, seperti kasus ini, atau variabel yang belum dideklarasikan. Perbaikannya tergantung niat kita: bila maksudnya variabel pesan yang sudah ada, perbaiki ejaannya; bila memang variabel baru, deklarasikan lebih dulu dengan := seperti di chapter Deklarasi Pendek
.
Kasus 3: Kesalahan Sintaks #
Berkas error-sintaks.go kehilangan kurung kurawal penutup milik fungsi main:
package main
import "fmt"
func main() {
fmt.Println("Halo, Siti!")Jalankan berkas tersebut:
go run error-sintaks.goOutput yang Dihasilkan:
# command-line-arguments
./error-sintaks.go:7:1: syntax error: unexpected EOF, expected }Berkas hanya memiliki enam baris, tetapi compiler menunjuk 7:1: posisi tepat setelah baris terakhir, saat compiler menemui akhir berkas (EOF, end of file). Compiler mendapati expected } yang tidak pernah hadir, sehingga } yang hilang berada di suatu tempat sebelum posisi tersebut. Pola ini penting dipahami: untuk kesalahan sintaks, lokasi yang ditunjuk sering kali berada setelah titik masalah yang sebenarnya, jadi kita perlu membaca ke atas dari posisi tersebut. Perbaikannya satu baris saja: tambahkan } penutup setelah fmt.Println("Halo, Siti!").
Strategi Membaca Error #
Tiga kasus di atas melatih pola kerja yang sama. Baca pesan paling atas lebih dulu, burung lokasi baris-kolomnya di editor, pahami isi pesannya, lalu perbaiki. Setelah satu perbaikan, jalankan ulang programnya, karena satu kesalahan sering menyembunyikan kesalahan lain di belakangnya; compiler hanya melaporkan yang pertama kali ditemukan pada tahap tertentu. Perintah gagal selalu berhenti dengan exit code 1, tanda yang bisa kita periksa lewat echo $? seperti di chapter Menjalankan Program
.
Dengan anatomi program, package main, fungsi main, import, fmt.Println, cara menjalankan, mengompilasi, dan kini membaca pesan error, bekal dasar kita sudah lengkap. Section berikutnya, Dasar Bahasa Go
, mengajak kita mengolah data sungguhan dengan variabel, konstanta, dan tipe.
Referensi #
- Dokumentasi perintah go
— perilaku
go rundango buildsaat kompilasi gagal. - Effective Go — panduan resmi praktik menulis Go yang bersih.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
error-sintaks.go
Unduh berkaspackage main
import "fmt"
func main() {
fmt.Println("Halo, Siti!")
error-undefined.go
Unduh berkaspackage main
import "fmt"
func main() {
fmt.Println(pesann)
}
error-unused.go
Unduh berkaspackage main
import "fmt"
func main() {
pesan := "Halo, Budi!"
fmt.Println("Pesan sudah disiapkan")
}