Baca dalam bahasa Inggris

Alur kontrol dengan pernyataan sakelar

Selesai

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:

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

Go
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.

Go
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.

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

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

Go
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.

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

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.