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.

go
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:

go
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:

go
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:

bash
go run switch-demo.go

Output yang Dihasilkan:

text
Fitur paket pro: kuota 10 GB
Fitur paket premium: dukungan prioritas
Kredit masih aman
Sangat panas, hindari aktivitas di luar ruangan

Mari kita telaah baris demi baris program di atas:

  1. Baris 6 (paket := "pro"): menyimpan nilai yang akan dibandingkan oleh switch pertama.
  2. Baris 8-17 (switch paket { ... }): nilai "pro" cocok dengan case "pro" di baris 12, mencetak fitur kuota, lalu fallthrough meneruskan eksekusi ke blok case "premium" di baris 15 tanpa memeriksa nilainya. Cabang "free" dan tiga fallthrough lainnya tidak tersentuh.
  3. Baris 19 (sisaKredit := 7): menyimpan nilai untuk switch kedua.
  4. Baris 21 (switch sisa := sisaKredit; sisa): bentuk switch dengan initializer. Variabel sisa dideklarasikan dan diisi sebelum pembandingan dimulai, dan sisa hanya hidup di dalam blok switch ini — persis seperti ruang lingkup sempit pada chapter if dengan Initializer .
  5. Baris 22-24 (case 0 dan case 1, 2): case kedua memuat dua nilai sekaligus. Nilai 7 tidak cocok dengan 0, 1, maupun 2, sehingga alur jatuh ke default.
  6. Baris 28-36 (switch { ... }): tagless switch tanpa ekspresi. Kondisi suhu >= 31 bernilai true terhadap 34, bloknya dieksekusi, dan sisa kondisi tidak dievaluasi lagi.

Tabel berikut merangkum varian switch yang telah kita bahas:

VarianBentukKapan dipakai
Dengan ekspresiswitch x { case 1: }Membandingkan satu nilai terhadap banyak kemungkinan
Nilai jamakcase 1, 3, 5:Beberapa nilai berbagi blok yang sama
Dengan initializerswitch v := f(); v { }Butuh variabel sementara untuk pembandingan
Taglessswitch { case x > 0: }Menggantikan rantai if/else if
Type switchswitch 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 #

Berkas Sumber

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

switch-demo.go

Unduh berkas
go
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")
	}
}