switch memilih satu cabang dengan mencocokkan sebuah nilai ke daftar case. Bayangin papan harga di Warung Bakso Mas Bimo: pembeli menyebut nama menu, Mas Bimo mencari barisnya dari atas, menyebut harganya, lalu selesai. Dia gak lanjut membacakan harga menu di baris berikutnya. Kalau menunya gak ada di papan, dia bilang "Menu gak ada".
🧪 Tebakan cepat: di JavaScript,
switchtanpabreakjalan terus ke case berikutnya. Kode di bagian "switch dengan nilai" gak punya satubreakpun. Denganmenuberisi"Mie ayam", berapa baris yang tercetak: 1, 2, atau 3? Jawabannya ada di bagian "Tiap case berhenti sendiri".
switch dengan nilai
package main
import "fmt"
func main() {
menu := "Mie ayam"
switch menu {
case "Bakso urat":
fmt.Println("Rp15.000")
case "Mie ayam":
fmt.Println("Rp12.000")
case "Es teh", "Es jeruk":
fmt.Println("Rp5.000")
default:
fmt.Println("Menu gak ada")
}
}
Rp12.000
switch menumembandingkanmenudengan tiapcasedari atas ke bawah, seperti==. Case pertama yang sama yang jalan.case "Es teh", "Es jeruk":satu case boleh punya beberapa nilai, dipisah koma. Cocok dengan salah satunya sudah cukup.default:jalan kalau gak ada case yang cocok. Boleh gak ditulis; tanpadefaultdan tanpa case yang cocok, switch gak melakukan apa-apa.- Seperti
if,menugak perlu dikurung, dan{harus di baris yang sama.
menu |
Case yang cocok | Tercetak |
|---|---|---|
"Bakso urat" |
case "Bakso urat" |
Rp15.000 |
"Mie ayam" |
case "Mie ayam" |
Rp12.000 |
"Es jeruk" |
case "Es teh", "Es jeruk" |
Rp5.000 |
"Es campur" |
gak ada, jadi default |
Menu gak ada |
Nanti, di lesson Interface, ada juga type switch yang memilih berdasarkan tipe, bukan nilai.
Tiap case berhenti sendiri
Di Go, begitu isi case yang cocok selesai, switch-nya ikut selesai. Kamu gak perlu menulis break. Ini beda dengan C, Java, dan JavaScript, yang tanpa break terus menjalankan isi case di bawahnya. Jadi dengan "Mie ayam", yang tercetak cuma 1 baris: Rp12.000. Itu jawaban tebakannya. Menulis break di akhir case tetap boleh, tapi gak ada gunanya.
fallthrough: lanjut ke case berikutnya dengan sengaja
Kalau kamu memang mau isi case berikutnya ikut jalan, tulis fallthrough di baris terakhir case-nya:
paket := "komplit"
switch paket {
case "komplit":
fmt.Println("+ telur")
fallthrough
case "biasa":
fmt.Println("+ bakso")
case "hemat":
fmt.Println("+ kuah")
}
+ telur
+ bakso
fallthroughmenjalankan isi case tepat di bawahnya tanpa mengecek nilainya."komplit"jelas gak sama dengan"biasa", tapi+ baksotetap tercetak.- Lompatnya cuma satu case.
+ kuahgak tercetak, karena case"biasa"gak punyafallthrough. - Di case paling akhir,
fallthroughgagal compile:cannot fallthrough final case in switch. - Jarang dipakai. Beberapa nilai dalam satu case biasanya lebih jelas.
switch tanpa nilai: pengganti if-else berantai
Ingat bonus dari lesson If Else? Rantai if-else if itu bisa ditulis sebagai switch tanpa nilai:
total := 45000
switch {
case total >= 50000:
fmt.Println("Gratis es teh")
case total >= 30000:
fmt.Println("Gratis kerupuk")
default:
fmt.Println("Belum dapat bonus")
}
Gratis kerupuk
switch { tanpa nilai artinya tiap case berisi syarat, dan case pertama yang true yang jalan. Sisanya gak dicek lagi.
total |
>= 50000 |
>= 30000 |
Tercetak |
|---|---|---|---|
| 20000 | false |
false |
Belum dapat bonus |
| 45000 | false |
true |
Gratis kerupuk |
| 60000 | true |
gak dicek | Gratis es teh |
Urutannya penting. Kalau total >= 30000 ditaruh paling atas, 60.000 berhenti di sana dan dapat kerupuk, bukan es teh. Jangan juga menaruh total di belakang switch kalau case-nya berisi syarat: switch total { case total >= 30000: } gagal compile dengan cannot convert total >= 30000 (untyped bool value) to type int, karena tiap case dibandingkan dengan total yang angka.
⚠️ Jebakan yang sering ketemu
breakdi dalam switch, di dalam for.breakdi situ cuma keluar dari switch, bukan dari loop-nya, jadi putaran berikutnya tetap jalan. Untuk keluar dari loop, pakaiifdenganbreakdi luar switch.- Urutan case di switch tanpa nilai. Syarat yang paling sempit (
>= 50000) taruh paling atas. - Mengira
fallthroughmengecek case berikutnya. Gak: isinya langsung jalan. - Nilai yang sama di dua case. Go menolaknya saat compile:
duplicate case "Bakso urat" (constant of type string) in expression switch.
TL;DR: switch nilai { case a: ... case b, c: ... default: ... } membandingkan nilainya dengan tiap case dari atas, dan hanya case pertama yang cocok yang jalan. Di Go tiap case berhenti sendiri, tanpa break. fallthrough sengaja menjalankan isi case berikutnya tanpa mengecek nilainya. switch { case syarat: ... } tanpa nilai adalah pengganti if-else berantai: case pertama yang true menang, jadi urutannya penting.