Beberapa nilai dalam program tidak boleh berubah setelah ditulis: nama aplikasi, batas maksimum stok, tarif pajak, atau nomor port. Konstanta adalah deklarasi Go untuk nilai tetap tersebut: sekali diikat pada saat kompilasi, nilainya tidak dapat ditimpa saat program berjalan. Pada chapter ini kita akan mendeklarasikan konstanta dengan kata kunci const, membedah perilaku untyped constant yang lentur, melihat keterbatasan typed constant, lalu memakai iota untuk membuat deret nilai berurutan seperti daftar hari.

Mendeklarasikan Konstanta #

Bentuk deklarasi konstanta mirip dengan var, tetapi setiap konstanta wajib memiliki nilai yang sudah bisa dihitung pada saat kompilasi:

go
const namaAplikasi = "Kasir Mini"
const batasStok = 100

Nilai konstanta boleh berupa literal, ekspresi aritmetika dari konstanta lain, atau hasil fungsi sederhana seperti len("Kasir"). Nilai hasil pembacaan input pengguna atau variabel yang baru diisi saat runtime tidak boleh dijadikan konstanta, karena nilainya belum diketahui compiler. Menimpa nilai konstanta dengan batasStok = 200 adalah galat kompilasi cannot assign to batasStok.

Untyped Constant yang Lentur #

Sebagian besar konstanta di Go berstatus untyped: konstanta 100 di atas tidak terikat pada int, float64, maupun tipe lain. Tipe baru melekat ketika konstanta dipakai dalam konteks tertentu, sehingga satu konstanta yang sama bisa berperan sebagai int pada satu baris dan float64 pada baris lain. Program utuh di bawah memakai batasStok dalam dua peran tersebut: sebagai pengurang int pada sisa dan sebagai pembagi float64 pada persenTerisi.

Typed Constant yang Terbatas #

Kita juga dapat mengunci tipe sebuah konstanta secara eksplisit dengan menuliskan tipenya:

go
const pajak float64 = 11
var berat int = 40
total := berat * pajak // galat kompilasi

Konstanta pajak yang sudah bertipe float64 kehilangan kelenturan untyped: compiler menolak berat * pajak dengan pesan invalid operation: berat * pajak (mismatched types int and float64). Agar program lolos kompilasi, ekspresi tersebut harus dikonversi eksplisit menjadi float64(berat) * pajak, sesuai aturan konversi tipe pada chapter Konversi Tipe .

Deret Konstanta dengan iota #

Kata bantu iota menghasilkan angka yang bertambah satu setiap baris di dalam blok const. Kombinasi ini dipakai untuk membuat nilai berurutan ala enum:

go
const (
	Senin = iota + 1
	Selasa
	Rabu
)

Pada baris pertama, iota bernilai 0 sehingga Senin bernilai 1. Baris berikutnya mengulang ekspresi iota + 1 dengan iota yang sudah bertambah: Selasa bernilai 2 dan Rabu bernilai 3. Penambahan + 1 dipakai agar deret dimulai dari angka satu, bukan nol.

Program Utuh #

Berkas konstanta-demo.go menggabungkan konstanta untyped, konstanta lokal, dan deret iota. Jalankan berkas tersebut dari direktori chapter:

bash
go run konstanta-demo.go
go
package main

import "fmt"

const namaAplikasi = "Kasir Mini"
const batasStok = 100

const (
	Senin = iota + 1
	Selasa
	Rabu
)

func main() {
	fmt.Println(namaAplikasi)

	stokSaatIni := 72
	sisa := batasStok - stokSaatIni
	fmt.Println("Sisa stok:", sisa, "dari", batasStok)

	persenTerisi := float64(stokSaatIni) / batasStok * 100
	fmt.Printf("Terisi: %.0f%%\n", persenTerisi)

	const diskon = 20
	harga := 150000
	total := harga * (100 - diskon) / 100
	fmt.Println("Total setelah diskon:", total)

	fmt.Println("Hari ke-", Senin, Selasa, Rabu)
}

Output yang Dihasilkan:

text
Kasir Mini
Sisa stok: 28 dari 100
Terisi: 72%
Total setelah diskon: 120000
Hari ke- 1 2 3

Mari kita telaah baris demi baris program di atas:

  1. Baris 6 (const namaAplikasi = "Kasir Mini"): mendeklarasikan konstanta string untyped di level package.
  2. Baris 7 (const batasStok = 100): mendeklarasikan konstanta numerik untyped yang akan berperan ganda sebagai int dan float64.
  3. Baris 9–12 (blok const dengan iota): mendeklarasikan deret Senin, Selasa, Rabu dengan nilai 1, 2, 3.
  4. Baris 18 (sisa := batasStok - stokSaatIni): memakai batasStok sebagai int karena stokSaatIni bertipe int.
  5. Baris 21 (persenTerisi := float64(stokSaatIni) / batasStok * 100): memakai konstanta yang sama sebagai float64 karena operan kirinya sudah dikonversi — inilah kelenturan untyped constant.
  6. Baris 24 (const diskon = 20): mendeklarasikan konstanta lokal di dalam fungsi, sah karena nilainya diketahui saat kompilasi.
  7. Baris 26 (total := harga * (100 - diskon) / 100): menghitung 150000 × 80 ÷ 100 = 120000 dengan aritmetika int, karena diskon untyped menyesuaikan konteks.

Nilai yang dijamin tidak berubah sebaiknya selalu dinyatakan sebagai konstanta, bukan variabel, agar compiler ikut menjaga janji tersebut. Ketika nilai perlu dihitung ulang saat program berjalan, gunakan variabel biasa, dan ketika dua tipe berbeda harus bertemu dalam satu rumus, ikuti aturan eksplisit pada chapter Konversi Tipe .

Referensi #

Berkas Sumber

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

konstanta-demo.go

Unduh berkas
go
package main

import "fmt"

const namaAplikasi = "Kasir Mini"
const batasStok = 100

const (
	Senin = iota + 1
	Selasa
	Rabu
)

func main() {
	fmt.Println(namaAplikasi)

	stokSaatIni := 72
	sisa := batasStok - stokSaatIni
	fmt.Println("Sisa stok:", sisa, "dari", batasStok)

	persenTerisi := float64(stokSaatIni) / batasStok * 100
	fmt.Printf("Terisi: %.0f%%\n", persenTerisi)

	const diskon = 20
	harga := 150000
	total := harga * (100 - diskon) / 100
	fmt.Println("Total setelah diskon:", total)

	fmt.Println("Hari ke-", Senin, Selasa, Rabu)
}