Compiler Go terkenal galak: kode yang tidak dipakai atau tipe yang tidak cocok langsung ditolak sebelum program berjalan. Galak di sini adalah kebaikan, karena setiap penolakan datang dengan lokasi persis (berkas:baris:kolom) dan kalimat error yang mengikuti pola tetap. Pada chapter ini kita akan membedah tiga pesan error yang paling sering dijumpai pemula, menerjemahkan maksudnya, lalu memperbaikinya menjadi program yang lolos kompilasi.
Anatomi Pesan Error Compiler #
Perintah go run atau go build memanggil compiler, dan ketika kompilasi gagal pesan error dicetak ke standard error lengkap dengan posisi sumbernya. Formatnya selalu sama: nama berkas, nomor baris, nomor kolom, lalu deskripsi masalah. Baris # command-line-arguments di atasnya hanyalah nama package sementara yang dipakai go run saat mengompilasi berkas tunggal, bukan bagian dari masalahnya.
Berkas error-import-tak-dipakai.go di bawah halaman mengimpor package os tetapi tidak pernah memakainya:
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println("Menyimpan laporan penjualan...")
}Jalankan berkas tersebut, lalu compiler menolaknya:
go run error-import-tak-dipakai.go# command-line-arguments
./error-import-tak-dipakai.go:5:2: "os" imported and not usedPesan ini membaca ./error-import-tak-dipakai.go:5:2 — baris 5, kolom 2 — tepat di tempat "os" dituliskan. Maknanya: Go melarang import yang tidak menghasilkan efek apa pun, karena import menganggap dependensi yang tidak dipakai sebagai indikasi kode setengah jadi. Perbaikannya dua pilihan: hapus baris import "os", atau tambahkan pemakaian os di dalam kode.
Tiga Pola Pesan dan Terjemahannya #
Dua pola lain muncul dari berkas error-variabel-tak-dipakai.go dan error-tipe-tak-cocok.go. Tabel berikut merangkum ketiga pola pesan menjadi langkah perbaikan yang konkret:
| Pola pesan | Contoh nyata | Makna | Perbaikan |
|---|---|---|---|
"..." imported and not used | "os" imported and not used | Package diimpor tanpa satu pun pemakaian | Hapus import, atau pakai package-nya |
declared and not used: x | declared and not used: totalBelanja | Variabel lokal dideklarasikan tetapi tidak pernah dibaca atau ditulis lagi | Hapus deklarasi, atau pakai variabelnya |
cannot use X as T value in assignment | cannot use "tiga" (untyped string constant) as int value in assignment | Nilai bertipe berbeda dimasukkan ke variabel yang tipenya sudah tetap | Ubah nilai agar cocok, atau ubah tipe variabel |
Mari kita lihat bentuk asli kedua pesan lainnya. Berkas error-variabel-tak-dipakai.go mendeklarasikan totalBelanja lalu hanya mencetak teks statis:
package main
import "fmt"
func main() {
totalBelanja := 150000
fmt.Println("Menghitung diskon...")
}go run error-variabel-tak-dipakai.go# command-line-arguments
./error-variabel-tak-dipakai.go:6:2: declared and not used: totalBelanjaSementara error-tipe-tak-cocok.go memasukkan string "tiga" ke variabel yang sejak awal bertipe int karena diisi angka 3:
package main
import "fmt"
func main() {
jumlahItem := 3
jumlahItem = "tiga"
fmt.Println("Jumlah item:", jumlahItem)
}go run error-tipe-tak-cocok.go# command-line-arguments
./error-tipe-tak-cocok.go:7:15: cannot use "tiga" (untyped string constant) as int value in assignmentVersi yang Sudah Diperbaiki #
Berkas contoh.go menggabungkan ketiga perbaikan: import os dipakai untuk membaca argumen command line, setiap variabel yang dideklarasikan dipakai, dan strconv.Itoa mengubah angka menjadi string alih-alih menimpakan string ke variabel int:
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
namaPelanggan := "Budi"
if len(os.Args) > 1 {
namaPelanggan = os.Args[1]
}
jumlahItem := 3
keterangan := "total item: " + strconv.Itoa(jumlahItem)
fmt.Println("Pelanggan:", namaPelanggan)
fmt.Println(keterangan)
}Output yang Dihasilkan:
Pelanggan: Budi
total item: 3Mari kita telaah baris demi baris program yang sudah diperbaiki:
- Baris 5 (
"os"): importoskini sah karenaos.Argsdipakai pada baris 11–13. - Baris 10–13: variabel
namaPelanggandiinisialisasi"Budi", lalu diganti darios.Args[1]bila argumen diberikan; variabel tersebut pasti terpakai pada baris 18. - Baris 15–16:
jumlahItembertipeinttetap konsisten; konversi ke string dilakukan olehstrconv.Itoasehingga tidak ada tipe yang bertabrakan. - Baris 18–19: kedua variabel dicetak, sehingga tidak ada satu pun deklarasi yang menganggur.
Dengan pola baca berkas:baris:kolom plus tabel terjemahan di atas, mayoritas error kompilasi selesai dalam hitungan detik. Namun tidak semua masalah bisa dicegat compiler — kesalahan logika saat program berjalan tetap diam — dan untuk itu kita naik kelas ke debugger Delve pada chapter berikutnya.
Referensi #
- The Go Programming Language Specification — aturan resmi assignment, konversi tipe, dan deklarasi.
- Dokumentasi Go — titik masuk resmi dokumentasi bahasa dan tooling.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.go
Unduh berkaspackage main
import (
"fmt"
"os"
"strconv"
)
func main() {
namaPelanggan := "Budi"
if len(os.Args) > 1 {
namaPelanggan = os.Args[1]
}
jumlahItem := 3
keterangan := "total item: " + strconv.Itoa(jumlahItem)
fmt.Println("Pelanggan:", namaPelanggan)
fmt.Println(keterangan)
}
error-import-tak-dipakai.go
Unduh berkaspackage main
import (
"fmt"
"os"
)
func main() {
fmt.Println("Menyimpan laporan penjualan...")
}
error-tipe-tak-cocok.go
Unduh berkaspackage main
import "fmt"
func main() {
jumlahItem := 3
jumlahItem = "tiga"
fmt.Println("Jumlah item:", jumlahItem)
}
error-variabel-tak-dipakai.go
Unduh berkaspackage main
import "fmt"
func main() {
totalBelanja := 150000
fmt.Println("Menghitung diskon...")
}