switch membandingkan satu nilai dengan daftar case dan menjalankan case pertama yang cocok. Berbeda dari C, Java, dan JavaScript, case di Go tidak berlanjut ke case berikutnya, jadi tidak ada break yang bisa terlupa.
Case diperiksa dari atas ke bawah, dan hanya case pertama yang cocok yang dijalankan. default dijalankan ketika tidak ada yang cocok; bagian ini opsional dan bisa muncul di mana saja dalam daftar, walaupun menurut konvensi ditaruh paling akhir.
Banyak nilai per case
case "sat", "sun": cocok dengan salah satu nilai itu. Inilah cara Go menuliskan apa yang di C dilakukan dengan menumpuk case kosong. Tipe apa pun yang bisa dibandingkan bisa dipakai: string, angka, rune, boolean, pointer, dan tipe bernama seperti enum:
Dua case dengan nilai konstanta yang sama adalah error kompilasi:
./main.go:10:7: duplicate case 1 (constant of type int) in expression switch
./main.go:8:7: previous case
Switch tanpa kondisi
Hilangkan ekspresinya, dan setiap case menjadi pengujian boolean. Inilah bentuk yang lebih rapi di Go untuk rangkaian if/else if yang panjang:
switch { adalah singkatan dari switch true {. Karena case pertama yang bernilai true yang menang, urutan itu penting: bmi < 25 hanya dicapai ketika bmi < 18.5 bernilai false, jadi setiap case boleh menganggap case di atasnya sudah gagal.
Switch dengan pernyataan init
Seperti if, switch bisa diawali pernyataan singkat. Variabel yang dideklarasikan di sana hanya berlaku di dalam switch:
Pernyataan init juga bisa digabung dengan switch tanpa kondisi: switch n := len(items); { case n == 0: ... }.
fallthrough
Kalau kamu memang ingin berlanjut ke case berikutnya, tulis fallthrough sebagai pernyataan terakhir sebuah case. Kata kunci ini memindahkan kendali ke badan case berikutnya tanpa mengevaluasi kondisinya:
Level 2 mencetak write lalu read, mengumpulkan izin ke bawah. Kondisi case-case berikutnya tidak diperiksa: setelah fallthrough dari case 2, case 1 tetap dijalankan walaupun level bernilai 2.
Aturan untuk fallthrough:
- Harus menjadi pernyataan terakhir di dalam case.
- Tidak boleh muncul di case terakhir:
cannot fallthrough final case in switch. - Tidak diizinkan di type switch.
Dalam praktiknya, fallthrough jarang dipakai di kode Go. Banyak nilai per case sudah mencakup kebutuhan yang umum, dan pemanggilan fungsi yang eksplisit biasanya lebih jelas daripada rangkaian fallthrough.
break di dalam switch
break di dalam case keluar dari switch. Case berakhir dengan sendirinya, jadi kamu hanya membutuhkannya untuk keluar dari case lebih awal. Jebakannya adalah switch di dalam perulangan:
Tanpa label loop, break hanya mengakhiri switch dan perulangan terus berjalan sampai "c". Sebaliknya, continue selalu mengacu pada perulangan yang membungkusnya, karena switch bukan perulangan.
Switch berdasarkan tipe
Type switch bercabang berdasarkan tipe dinamis dari sebuah nilai interface, dengan bentuk khusus v.(type):
Di case dengan satu tipe, x bertipe itu (len(x) bisa dipakai di case string). Di case yang berisi beberapa tipe, x tetap bertipe interface. Halaman type assertion membahas type switch dan assertion v.(T) secara lengkap.
Hal yang dilakukan switch Go secara berbeda
| Perilaku | C, Java, JavaScript | Go |
|---|---|---|
| Berlanjut ke case berikutnya | default | hanya dengan fallthrough |
break di akhir setiap case | wajib | tidak perlu |
| Beberapa nilai per case | case kosong yang ditumpuk | case a, b, c: |
| Nilai case | konstanta (umumnya) | ekspresi apa pun, dievaluasi dari atas ke bawah |
| Nilai switch | tipe integer (C) | tipe apa pun yang bisa dibandingkan |
| Tanpa ekspresi switch | tidak diizinkan | switch { case cond: } |
Ekspresi case tidak harus berupa konstanta. case limit(), max + 1: itu sah; ekspresi-ekspresi itu dievaluasi berurutan sampai ada yang cocok, jadi ekspresi yang lebih belakang mungkin tidak pernah dijalankan.
Kelengkapan case
Go tidak memeriksa apakah switch atas sebuah enum sudah mencakup semua nilainya. Tambahkan default yang mencatat log, mengembalikan error, atau panic untuk nilai yang tidak kamu duga, atau pakai linter exhaustive (bagian dari golangci-lint) agar case yang terlewat dilaporkan saat build.
Pertanyaan yang sering diajukan
Apakah switch di Go berlanjut ke case berikutnya?
Tidak. Sebuah case di Go otomatis berakhir di case berikutnya; kamu tidak pernah perlu menulis break untuk menghentikannya. Kalau kamu ingin eksekusi berlanjut ke badan case berikutnya, tulis fallthrough sebagai pernyataan terakhir di case itu. Lompatan ini terjadi tanpa syarat, tanpa memeriksa kondisi case berikutnya.
Bagaimana cara mencocokkan beberapa nilai dalam satu case di Go?
Tulis nilai-nilainya dipisahkan koma: case "sat", "sun":. Case itu dijalankan jika nilai switch sama dengan salah satunya. Cara ini menggantikan case kosong yang ditumpuk agar berlanjut, seperti di C atau Java.
Apa itu switch tanpa kondisi di Go?
switch { case x < 0: ...; case x == 0: ...; default: ... }. Tanpa ekspresi setelah switch, setiap case adalah kondisi boolean dan case pertama yang bernilai true yang dijalankan. Inilah pengganti idiomatis untuk rangkaian if/else if yang panjang.
Apa yang dilakukan break di dalam switch di Go?
Ia mengakhiri switch, bukan for loop yang membungkusnya. Hal ini jarang dibutuhkan, karena case berakhir dengan sendirinya, tetapi sering mengejutkan orang yang menulis break di dalam switch di dalam perulangan dengan harapan keluar dari perulangan. Untuk itu, pakai break berlabel atau return.