Lompati ke konten utama
Modul 2 · Pelajaran 4 dari 59/50 dalam kursus~10 min
Pelajaran modul (4/5)

Sakelar idiomatis

switch Go lebih ergonomis dibandingkan C/Java: masing-masing case memiliki blok implisitnya sendiri (tidak ada break untuk ditulis), Anda dapat mengelompokkannya beberapa nilai dengan koma, dan switch berperilaku tanpa ekspresi seperti rantai if/else if yang lebih mudah dibaca.

Aktifkan suatu nilai

Go
giorno := "mar"
switch giorno {
case "lun", "mar", "mer", "gio", "ven":
    fmt.Println("feriale")
case "sab", "dom":
    fmt.Println("weekend")
default:
    fmt.Println("sconosciuto")
}

case menerima beberapa nilai yang dipisahkan dengan koma dan tidak ada yang tersirat fallthrough: segera setelah kasus dijalankan, saklar keluar.

Beralih tanpa syarat

Jika Anda menghilangkan ekspresi tersebut, saklar akan mengevaluasi true dan setiap case adalah a kondisi bool. Ini adalah alternatif idiomatis untuk rantai if/else if yang panjang:

Go
switch {
case x < 0:
    fmt.Println("negativo")
case x == 0:
    fmt.Println("zero")
case x < 10:
    fmt.Println("piccolo")
default:
    fmt.Println("grande")
}

Pernyataan init

Seperti halnya if, switch juga menerima pernyataan init:

Go
switch n := len(s); {
case n == 0:
    fmt.Println("vuoto")
case n > 100:
    fmt.Println("lungo")
default:
    fmt.Println("ok")
}

n hanya ada di dalam saklar.

Eksplisit fallthrough

Jika Anda benar-benar ingin eksekusi masuk ke kasus berikutnya, Anda harus menulisnya:

Go
switch 1 {
case 1:
    fmt.Println("uno")
    fallthrough
case 2:
    fmt.Println("due")  // anche questo viene stampato
case 3:
    fmt.Println("tre")  // questo no
}

Sakelar tipe (pratinjau)

Ini memungkinkan Anda melakukan diskriminasi berdasarkan tipe dinamis antarmuka nilai. Kami akan membahasnya secara mendalam di modul Antarmuka:

Go
var i interface{} = "ciao"
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("tipo %T\n", v)
}

Cobalah

Latihan#go.m2.l4.e1
Upaya: 0Memuat…

Cetak 'feriale' untuk lun/mar/mer/gio/ven, 'weekend' jika tidak, gunakan tombol pada nilai g.

Memuat editor…
Tunjukkan petunjuk

Kelompokkan 5 hari kerja menjadi satu kasus yang dipisahkan dengan koma.

Solusi tersedia setelah 3 upaya

Latihan#go.m2.l4.e2
Upaya: 0Memuat…

Gunakan saklar TANPA syarat untuk mencetak 'neg', 'zero' atau 'pos' tergantung pada x.

Memuat editor…
Tunjukkan petunjuk

Tidak ada ekspresi setelah `switch`, hanya `{`.

Solusi tersedia setelah 3 upaya

Quiz#go.m2.l4.e3
Siap

Apa yang dicetak oleh program ini?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Pilihan jawaban

Rekap

  • case menerima beberapa nilai yang dipisahkan dengan koma.
  • Tidak ada kesalahan implisit: setiap kasus memiliki break implisitnya sendiri.
  • switch { ... } tanpa ekspresi = rantai if/else if yang lebih mudah dibaca.
  • Pernyataan init: switch x := f(); { ... }, cakupannya terbatas pada blok.
  • fallthrough ada tetapi jarang; memasuki kasus berikutnya TANPA mengevaluasi kondisinya.
  • Ketik saklar v := i.(type) untuk membedakan berdasarkan tipe dinamis (modul Antarmuka).