Alur kontrol dengan pernyataan sakelar
Seperti bahasa pemrograman lainnya, Go mendukung switch
pernyataan. Anda menggunakan switch
pernyataan untuk menghindari penautan beberapa if
pernyataan. Dengan menggunakan switch
pernyataan, Anda menghindari kesulitan mempertahankan dan membaca kode yang mencakup banyak if
pernyataan. Pernyataan-pernyataan ini juga membuat kondisi yang rumit lebih mudah dibangun. Lihat pernyataan di switch
bagian berikut.
Sintaks switch dasar
Seperti if
pernyataan, switch
kondisinya tidak memerlukan tanda kurung. Dalam bentuknya yang paling sederhana, sebuah switch
pernyataan terlihat seperti ini:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
sec := time.Now().Unix()
rand.Seed(sec)
i := rand.Int31n(10)
switch i {
case 0:
fmt.Print("zero...")
case 1:
fmt.Print("one...")
case 2:
fmt.Print("two...")
}
fmt.Println("ok")
}
Jika Anda menjalankan kode sebelumnya beberapa kali, Anda akan melihat output yang berbeda setiap saat. (Tetapi jika Anda menjalankan kode di Go Playground, Anda akan mendapatkan hasil yang sama setiap saat. Itu salah satu batasan layanan.)
Go membandingkan setiap kasus pernyataan sampai menemukan kecocokan switch
untuk kondisi tersebut. Tetapi perhatikan bahwa kode sebelumnya tidak mencakup semua kemungkinan kasus num
nilai variabel. Jika num
akhirnya menjadi 5
, output programnya adalah ok
.
Anda juga bisa lebih spesifik tentang kasus penggunaan default dan menyertakannya seperti ini:
switch i {
case 0:
fmt.Print("zero...")
case 1:
fmt.Print("one...")
case 2:
fmt.Print("two...")
default:
fmt.Print("no match...")
}
Perhatikan bahwa untuk kasus ini default
, Anda tidak menulis ekspresi validasi. Nilai variabel divalidasi i
terhadap case
pernyataan, dan default
kasus menangani nilai yang tidak valid.
Gunakan beberapa ekspresi
Terkadang, lebih dari satu ekspresi hanya cocok dengan satu case
pernyataan. Di Go, jika Anda ingin case
pernyataan menyertakan lebih dari satu ekspresi, pisahkan ekspresi dengan menggunakan koma (,
). Teknik ini memungkinkan Anda untuk menghindari kode duplikat.
Sampel kode berikut menunjukkan cara menyertakan beberapa ekspresi.
package main
import "fmt"
func location(city string) (string, string) {
var region string
var continent string
switch city {
case "Delhi", "Hyderabad", "Mumbai", "Chennai", "Kochi":
region, continent = "India", "Asia"
case "Lafayette", "Louisville", "Boulder":
region, continent = "Colorado", "USA"
case "Irvine", "Los Angeles", "San Diego":
region, continent = "California", "USA"
default:
region, continent = "Unknown", "Unknown"
}
return region, continent
}
func main() {
region, continent := location("Irvine")
fmt.Printf("John works in %s, %s\n", region, continent)
}
Perhatikan bahwa nilai yang Anda sertakan dalam ekspresi untuk case
pernyataan sesuai dengan jenis data variabel yang divalidasi switch
oleh pernyataan. Jika Anda menyertakan nilai bilangan bulat sebagai pernyataan baru case
, program tidak akan dikompilasi.
Panggil fungsi
switch
juga dapat memanggil fungsi. Dari fungsi tersebut, Anda dapat menulis case
pernyataan untuk kemungkinan nilai pengembalian. Contohnya, kode berikut memanggil layanan time.Now()
. Output yang dicetaknya tergantung pada hari kerja saat ini.
package main
import (
"fmt"
"time"
)
func main() {
switch time.Now().Weekday().String() {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday":
fmt.Println("It's time to learn some Go.")
default:
fmt.Println("It's the weekend, time to rest!")
}
fmt.Println(time.Now().Weekday().String())
}
Saat Anda memanggil fungsi dari switch
pernyataan, Anda dapat mengubah logikanya tanpa mengubah ekspresi karena Anda selalu memvalidasi apa yang dikembalikan fungsi.
Selain itu, Anda dapat memanggil fungsi dari case
pernyataan. Gunakan teknik ini, misalnya, untuk mencocokkan pola tertentu dengan menggunakan ekspresi reguler. Berikut contohnya:
package main
import "fmt"
import "regexp"
func main() {
var email = regexp.MustCompile(`^[^@]+@[^@.]+\.[^@.]+`)
var phone = regexp.MustCompile(`^[(]?[0-9][0-9][0-9][). \-]*[0-9][0-9][0-9][.\-]?[0-9][0-9][0-9][0-9]`)
contact := "foo@bar.com"
switch {
case email.MatchString(contact):
fmt.Println(contact, "is an email")
case phone.MatchString(contact):
fmt.Println(contact, "is a phone number")
default:
fmt.Println(contact, "is not recognized")
}
}
Perhatikan bahwa switch
blok tidak memiliki ekspresi validasi. Mari kita bicara tentang konsep itu di bagian berikutnya.
Abaikan kondisi
Di Go, Anda dapat menghilangkan kondisi dalam pernyataan seperti yang switch
Anda lakukan dalam pernyataan if
. Pola ini seperti membandingkan true
nilai seolah-olah Anda memaksa switch
pernyataan untuk berjalan sepanjang waktu.
Berikut adalah contoh cara menulis switch
pernyataan tanpa kondisi:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
r := rand.Float64()
switch {
case r > 0.1:
fmt.Println("Common case, 90% of the time")
default:
fmt.Println("10% of the time")
}
}
Program selalu menjalankan jenis switch
pernyataan ini karena kondisinya selalu benar. Blok switch
kondisional bisa lebih mudah dipertahankan daripada rantai if
pernyataan dan else if
yang panjang.
Buat logika jatuh ke kasus berikutnya
Dalam beberapa bahasa pemrograman, Anda menulis break
kata kunci di akhir setiap case
pernyataan. Tetapi di Go, ketika logika jatuh ke dalam satu kasus, logika keluar dari switch
blok kecuali Anda secara eksplisit menghentikannya. Untuk membuat logika jatuh ke kasus langsung berikutnya, gunakan fallthrough
kata kunci.
Untuk memahami pola ini dengan lebih baik, lihat sampel kode berikut.
package main
import (
"fmt"
)
func main() {
switch num := 15; {
case num < 50:
fmt.Printf("%d is less than 50\n", num)
fallthrough
case num > 100:
fmt.Printf("%d is greater than 100\n", num)
fallthrough
case num < 200:
fmt.Printf("%d is less than 200", num)
}
}
Jalankan kode dan analisis output:
15 is less than 50
15 is greater than 100
15 is less than 200
Apakah Anda melihat sesuatu yang hilang?
Perhatikan bahwa karena num
15 (kurang dari 50), itu cocok dengan kasus pertama. Tapi num
tidak lebih besar dari 100. Dan karena pernyataan pertama case
memiliki fallthrough
kata kunci, logika langsung masuk ke case
pernyataan berikutnya tanpa memvalidasi kasus. Jadi, Anda harus berhati-hati saat menggunakan fallthrough
kata kunci. Anda mungkin tidak ingin perilaku yang dibuat kode ini.