Switch — Go

Switch di Go Switch di Go lebih fleksibel dibanding bahasa lain. Yang paling penting: tidak perlu break — setiap case otomatis berhenti setelah dieksekusi…

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, switch tanpa break jalan terus ke case berikutnya. Kode di bagian "switch dengan nilai" gak punya satu break pun. Dengan menu berisi "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
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

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

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.

Yang akan kamu pelajari