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:

go
package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("Menyimpan laporan penjualan...")
}

Jalankan berkas tersebut, lalu compiler menolaknya:

bash
go run error-import-tak-dipakai.go
text
# command-line-arguments
./error-import-tak-dipakai.go:5:2: "os" imported and not used

Pesan 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 pesanContoh nyataMaknaPerbaikan
"..." imported and not used"os" imported and not usedPackage diimpor tanpa satu pun pemakaianHapus import, atau pakai package-nya
declared and not used: xdeclared and not used: totalBelanjaVariabel lokal dideklarasikan tetapi tidak pernah dibaca atau ditulis lagiHapus deklarasi, atau pakai variabelnya
cannot use X as T value in assignmentcannot use "tiga" (untyped string constant) as int value in assignmentNilai bertipe berbeda dimasukkan ke variabel yang tipenya sudah tetapUbah 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:

go
package main

import "fmt"

func main() {
	totalBelanja := 150000

	fmt.Println("Menghitung diskon...")
}
bash
go run error-variabel-tak-dipakai.go
text
# command-line-arguments
./error-variabel-tak-dipakai.go:6:2: declared and not used: totalBelanja

Sementara error-tipe-tak-cocok.go memasukkan string "tiga" ke variabel yang sejak awal bertipe int karena diisi angka 3:

go
package main

import "fmt"

func main() {
	jumlahItem := 3
	jumlahItem = "tiga"

	fmt.Println("Jumlah item:", jumlahItem)
}
bash
go run error-tipe-tak-cocok.go
text
# command-line-arguments
./error-tipe-tak-cocok.go:7:15: cannot use "tiga" (untyped string constant) as int value in assignment

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

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

text
Pelanggan: Budi
total item: 3

Mari kita telaah baris demi baris program yang sudah diperbaiki:

  1. Baris 5 ("os"): import os kini sah karena os.Args dipakai pada baris 11–13.
  2. Baris 10–13: variabel namaPelanggan diinisialisasi "Budi", lalu diganti dari os.Args[1] bila argumen diberikan; variabel tersebut pasti terpakai pada baris 18.
  3. Baris 15–16: jumlahItem bertipe int tetap konsisten; konversi ke string dilakukan oleh strconv.Itoa sehingga tidak ada tipe yang bertabrakan.
  4. 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 #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.go

Unduh berkas
go
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)
}

error-import-tak-dipakai.go

Unduh berkas
go
package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println("Menyimpan laporan penjualan...")
}

error-tipe-tak-cocok.go

Unduh berkas
go
package main

import "fmt"

func main() {
	jumlahItem := 3
	jumlahItem = "tiga"

	fmt.Println("Jumlah item:", jumlahItem)
}

error-variabel-tak-dipakai.go

Unduh berkas
go
package main

import "fmt"

func main() {
	totalBelanja := 150000

	fmt.Println("Menghitung diskon...")
}