Di banyak bahasa pemrograman lama, variabel yang dideklarasikan tanpa nilai awal berisi sampah memori (garbage value) yang isinya tidak terduga. Go menghilangkan seluruh kelas bug ini dengan aturan sederhana: setiap variabel yang dideklarasikan tanpa nilai awal otomatis diisi zero value dari tipenya. Hasilnya selalu deterministik dan dapat diprediksi tanpa membaca dokumentasi tambahan. Pada chapter ini kita akan melihat zero value setiap kelompok tipe, memverifikasi nilainya lewat program nyata, dan memahami kapan zero value justru berguna sebagai titik awal perhitungan.

Aturan Zero Value #

Zero value ditentukan sepenuhnya oleh tipe variabel yang dideklarasikan. Tabel berikut merangkum zero value untuk kelompok tipe yang paling sering dipakai:

Kelompok tipeZero valueContoh tipe
Bilangan bulat0int, int8, uint64
Bilangan desimal0float32, float64
Booleanfalsebool
String"" (string kosong)string
Referensinilslice, map, pointer, channel, func, interface

Zero value melekat pada deklarasi var tanpa nilai awal, baik di dalam fungsi maupun di level package. Deklarasi pendek := tidak mengenal zero value karena bentuk tersebut selalu mengisi nilai sekaligus.

Program Utuh #

Berkas zero-value-demo.go mendeklarasikan satu variabel tanpa nilai awal untuk setiap kelompok tipe, lalu mencetak isinya. Jalankan berkas tersebut dari direktori chapter:

bash
go run zero-value-demo.go
go
package main

import "fmt"

func main() {
	var jumlah int
	var harga float64
	var aktif bool
	var nama string
	var daftar []string
	var alamat *int

	fmt.Println("jumlah =", jumlah)
	fmt.Println("harga =", harga)
	fmt.Println("aktif =", aktif)
	fmt.Printf("nama = %q\n", nama)
	fmt.Println("daftar =", daftar)
	fmt.Println("alamat =", alamat)

	jumlah = jumlah + 5
	fmt.Println("jumlah setelah ditambah 5 =", jumlah)
}

Output yang Dihasilkan:

text
jumlah = 0
harga = 0
aktif = false
nama = ""
daftar = []
alamat = <nil>
jumlah setelah ditambah 5 = 5

Mari kita telaah baris demi baris program di atas:

  1. Baris 6–11 (var jumlah int dan kawan-kawannya): mendeklarasikan enam variabel dari enam kelompok tipe, semuanya tanpa nilai awal sehingga berisi zero value masing-masing.
  2. Baris 13–15: mencetak jumlah, harga, dan aktif yang memperlihatkan 0, 0, dan false — angka nol pada float64 dicetak sebagai 0, bukan 0.0.
  3. Baris 16 (fmt.Printf("nama = %q\n", nama)): memakai verb %q agar string kosong terlihat jelas sebagai "", bukan baris kosong yang sulit diamati.
  4. Baris 17–18: mencetak slice dan pointer yang nilainya nil; fmt menampilkan slice nil sebagai [] dan pointer nil sebagai <nil>.
  5. Baris 20 (jumlah = jumlah + 5): membaca zero value 0 sebagai titik awal perhitungan, sehingga hasilnya 5.

Zero Value sebagai Titik Awal #

Baris terakhir program di atas memperlihatkan pola yang sering dipakai: zero value adalah nilai yang sah untuk dihitung, bukan keadaan error. Penghitung dimulai dari 0, akumulator penjumlahan dimulai dari 0, dan status boolean dimulai dari false sebelum diperiksa. Untuk tipe bentukan seperti struct, zero value diberikan per field: struct dengan field Nama string dan Umur int otomatis berisi "" dan 0 tanpa perlu inisialisasi manual.

Perbedaan nil dan "" pada String #

Pemula yang datang dari bahasa lain sering menganggap string kosong sebagai nil. Di Go, tipe string tidak memiliki nilai nil: string tanpa isi selalu "" dengan panjang nol, dan nil hanya milik kelompok tipe referensi seperti pointer, slice, dan map. Pemeriksaan nama == nil pada variabel string adalah galat kompilasi, sedangkan nama == "" adalah perbandingan yang sah.

Dengan jaminan zero value ini, kita bisa mendeklarasikan variabel jauh sebelum dipakai tanpa takut program berperilaku acak. Selanjutnya, ketika variabel sudah siap diisi nilai tetap dari kelompok true/false, angka, atau teks, kita masuk ke tipe data pertama yang paling sederhana: boolean.

Referensi #

Berkas Sumber

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

zero-value-demo.go

Unduh berkas
go
package main

import "fmt"

func main() {
	var jumlah int
	var harga float64
	var aktif bool
	var nama string
	var daftar []string
	var alamat *int

	fmt.Println("jumlah =", jumlah)
	fmt.Println("harga =", harga)
	fmt.Println("aktif =", aktif)
	fmt.Printf("nama = %q\n", nama)
	fmt.Println("daftar =", daftar)
	fmt.Println("alamat =", alamat)

	jumlah = jumlah + 5
	fmt.Println("jumlah setelah ditambah 5 =", jumlah)
}