Menu

Switch Case di Golang: fallthrough dan Banyak Nilai

Cara kerja switch di Go: case tidak berlanjut ke case berikutnya secara default, satu case bisa berisi beberapa nilai, switch tanpa kondisi menggantikan rangkaian if/else, switch dengan pernyataan init, kata kunci fallthrough, dan sekilas tentang type switch.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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

PerilakuC, Java, JavaScriptGo
Berlanjut ke case berikutnyadefaulthanya dengan fallthrough
break di akhir setiap casewajibtidak perlu
Beberapa nilai per casecase kosong yang ditumpukcase a, b, c:
Nilai casekonstanta (umumnya)ekspresi apa pun, dievaluasi dari atas ke bawah
Nilai switchtipe integer (C)tipe apa pun yang bisa dibandingkan
Tanpa ekspresi switchtidak diizinkanswitch { 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai