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:
const namaAplikasi = "Kasir Mini"
const batasStok = 100Nilai 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:
const pajak float64 = 11
var berat int = 40
total := berat * pajak // galat kompilasiKonstanta 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:
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:
go run konstanta-demo.gopackage 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:
Kasir Mini
Sisa stok: 28 dari 100
Terisi: 72%
Total setelah diskon: 120000
Hari ke- 1 2 3Mari kita telaah baris demi baris program di atas:
- Baris 6 (
const namaAplikasi = "Kasir Mini"): mendeklarasikan konstanta string untyped di level package. - Baris 7 (
const batasStok = 100): mendeklarasikan konstanta numerik untyped yang akan berperan ganda sebagaiintdanfloat64. - Baris 9–12 (blok
constdenganiota): mendeklarasikan deretSenin,Selasa,Rabudengan nilai 1, 2, 3. - Baris 18 (
sisa := batasStok - stokSaatIni): memakaibatasStoksebagaiintkarenastokSaatInibertipeint. - Baris 21 (
persenTerisi := float64(stokSaatIni) / batasStok * 100): memakai konstanta yang sama sebagaifloat64karena operan kirinya sudah dikonversi — inilah kelenturan untyped constant. - Baris 24 (
const diskon = 20): mendeklarasikan konstanta lokal di dalam fungsi, sah karena nilainya diketahui saat kompilasi. - Baris 26 (
total := harga * (100 - diskon) / 100): menghitung150000 × 80 ÷ 100 = 120000dengan aritmetikaint, karenadiskonuntyped 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 #
- Spesifikasi Go: Constant declarations
— aturan resmi deklarasi
constdaniota. - Effective Go: Constants — penjelasan kelenturan untyped constant dengan contoh.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
konstanta-demo.go
Unduh berkaspackage 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)
}