Rantai else if yang panjang cepat membuat letih: setiap baris mengulang nama variabel yang sama, dan tingkat menjorok terus bertambah. Ketika program membandingkan satu nilai terhadap banyak kemungkinan, switch menawarkan bentuk yang lebih rapi dan mudah dipindai. Go juga mendesain switch lebih aman daripada bahasa turunan C: setiap case berhenti sendiri tanpa memerlukan break. Pada chapter ini kita mempelajari switch dasar, kata kunci fallthrough, nilai jamak dalam satu case, bentuk tanpa ekspresi, hingga switch dengan initializer.
switch Dasar dengan break Implisit #
Bentuk paling sederhana membandingkan satu ekspresi terhadap daftar nilai di setiap case. Ketika nilai cocok, blok case tersebut dijalankan, lalu alur melompat ke akhir switch — cabang lain dilewati tanpa perlu menulis break. Perilaku ini kebalikan dari C dan Java yang secara default “jatuh” ke case berikutnya; di Go, kata kunci break implisit ada di ujung setiap case.
switch hari {
case "sabtu", "minggu":
fmt.Println("Akhir pekan")
case "senin":
fmt.Println("Awal minggu")
default:
fmt.Println("Hari kerja")
}Cabang default berjalan ketika tidak ada satu pun case yang cocok, setara dengan else pada rantai if. Perhatikan pula case "sabtu", "minggu": satu case boleh memuat beberapa nilai sekaligus, dan bloknya berjalan bila salah satu nilai cocok.
fallthrough: Melanjutkan ke Case Berikutnya #
Kadang kita justru menginginkan perilaku “jatuh” ala C, misalnya ketika paket layanan bersifat kumulatif — paket yang lebih tinggi mewarisi seluruh fitur paket di bawahnya. Kata kunci fallthrough memaksa eksekusi lanjut ke blok case berikutnya tanpa memeriksa nilainya:
case "pro":
fmt.Println("Fitur paket pro: kuota 10 GB")
fallthrough
case "premium":
fmt.Println("Fitur paket premium: dukungan prioritas")Ketika variabel bernilai "pro", kedua blok di atas sama-sama dijalankan. fallthrough meneruskan eksekusi apa adanya: kondisi case berikutnya tidak dievaluasi ulang, sehingga fitur paket premium tampil meski nilainya "pro", bukan "premium".
switch Tanpa Ekspresi #
Go mengizinkan switch ditulis tanpa ekspresi pembanding sama sekali. Bentuk ini, sering disebut tagless switch, mengevaluasi setiap kondisi case secara berurutan dari atas ke bawah — perilaku yang identik dengan rantai if/else if, tetapi tanpa pengulangan kata kunci. Bentuk ini ideal untuk membandingkan rentang nilai.
Program Utuh: Empat Varian switch #
Program berikut menggabungkan keempat varian: switch dengan fallthrough, case bernilai jamak, switch dengan initializer, dan tagless switch. Berkas switch-demo.go pada bagian bawah halaman memuat program yang sama:
package main
import "fmt"
func main() {
paket := "pro"
switch paket {
case "free":
fmt.Println("Fitur paket free: kuota 1 GB")
fallthrough
case "pro":
fmt.Println("Fitur paket pro: kuota 10 GB")
fallthrough
case "premium":
fmt.Println("Fitur paket premium: dukungan prioritas")
}
sisaKredit := 7
switch sisa := sisaKredit; sisa {
case 0:
fmt.Println("Kredit habis, isi ulang sekarang")
case 1, 2:
fmt.Println("Kredit menipis, siapkan isi ulang")
default:
fmt.Println("Kredit masih aman")
}
suhu := 34
switch {
case suhu >= 31:
fmt.Println("Sangat panas, hindari aktivitas di luar ruangan")
case suhu >= 26:
fmt.Println("Panas, bawa air minum")
default:
fmt.Println("Cuaca sejuk")
}
}Jalankan program dari direktori chapter dengan perintah berikut:
go run switch-demo.goOutput yang Dihasilkan:
Fitur paket pro: kuota 10 GB
Fitur paket premium: dukungan prioritas
Kredit masih aman
Sangat panas, hindari aktivitas di luar ruanganMari kita telaah baris demi baris program di atas:
- Baris 6 (
paket := "pro"): menyimpan nilai yang akan dibandingkan olehswitchpertama. - Baris 8-17 (
switch paket { ... }): nilai"pro"cocok dengancase "pro"di baris 12, mencetak fitur kuota, lalufallthroughmeneruskan eksekusi ke blokcase "premium"di baris 15 tanpa memeriksa nilainya. Cabang"free"dan tigafallthroughlainnya tidak tersentuh. - Baris 19 (
sisaKredit := 7): menyimpan nilai untukswitchkedua. - Baris 21 (
switch sisa := sisaKredit; sisa): bentukswitchdengan initializer. Variabelsisadideklarasikan dan diisi sebelum pembandingan dimulai, dansisahanya hidup di dalam blokswitchini — persis seperti ruang lingkup sempit pada chapter if dengan Initializer . - Baris 22-24 (
case 0dancase 1, 2):casekedua memuat dua nilai sekaligus. Nilai7tidak cocok dengan0,1, maupun2, sehingga alur jatuh kedefault. - Baris 28-36 (
switch { ... }): tagless switch tanpa ekspresi. Kondisisuhu >= 31bernilaitrueterhadap34, bloknya dieksekusi, dan sisa kondisi tidak dievaluasi lagi.
Tabel berikut merangkum varian switch yang telah kita bahas:
| Varian | Bentuk | Kapan dipakai |
|---|---|---|
| Dengan ekspresi | switch x { case 1: } | Membandingkan satu nilai terhadap banyak kemungkinan |
| Nilai jamak | case 1, 3, 5: | Beberapa nilai berbagi blok yang sama |
| Dengan initializer | switch v := f(); v { } | Butuh variabel sementara untuk pembandingan |
| Tagless | switch { case x > 0: } | Menggantikan rantai if/else if |
| Type switch | switch v := x.(type) | Memeriksa tipe dinamis interface — chapter berikutnya |
Variabel paket dan sisaKredit di atas bertipe string dan int yang sudah pasti sejak kompilasi. Bagaimana bila nilainya bertipe interface yang isinya baru diketahui saat program berjalan? Untuk itu Go menyediakan type switch, topik chapter berikutnya.
Referensi #
- Spesifikasi Go: Switch statements
— definisi resmi seluruh varian
switch. - Effective Go: switch — anjuran gaya dari tim Go.
- A Tour of Go: Flow control
— latihan interaktif
switchdanfallthrough.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
switch-demo.go
Unduh berkaspackage main
import "fmt"
func main() {
paket := "pro"
switch paket {
case "free":
fmt.Println("Fitur paket free: kuota 1 GB")
fallthrough
case "pro":
fmt.Println("Fitur paket pro: kuota 10 GB")
fallthrough
case "premium":
fmt.Println("Fitur paket premium: dukungan prioritas")
}
sisaKredit := 7
switch sisa := sisaKredit; sisa {
case 0:
fmt.Println("Kredit habis, isi ulang sekarang")
case 1, 2:
fmt.Println("Kredit menipis, siapkan isi ulang")
default:
fmt.Println("Kredit masih aman")
}
suhu := 34
switch {
case suhu >= 31:
fmt.Println("Sangat panas, hindari aktivitas di luar ruangan")
case suhu >= 26:
fmt.Println("Panas, bawa air minum")
default:
fmt.Println("Cuaca sejuk")
}
}