Rumah > pembangunan bahagian belakang > Golang > Mengapa Fallthrough Tidak Dibenarkan dalam Suis Jenis Go?

Mengapa Fallthrough Tidak Dibenarkan dalam Suis Jenis Go?

Mary-Kate Olsen
Lepaskan: 2024-11-12 19:54:02
asal
817 orang telah melayarinya

Why is Fallthrough Not Allowed in Go's Type Switch?

Fallthrough dalam Suis Jenis: Mengapa Tidak Dibenarkan?

Soalan:

In Go, cuba menggunakan pernyataan fallthrough dalam suis jenis menimbulkan ralat. Mengapakah fallthrough tidak dibenarkan dalam konteks ini?

Jawapan:

Dalam suis jenis, pembolehubah yang dihidupkan menukar jenis bergantung pada kes tertentu yang dilaksanakan. Sebagai contoh, pembolehubah i dalam kod berikut mempunyai jenis yang bergantung pada kes yang digunakan:

var x interface{}
switch i := x.(type) {
    case int:
        fmt.Println(i + 1)
    case float64:
        fmt.Println(i + 2.0)
    case bool:
        fallthrough
    case string:
        fmt.Printf("%v", i)
    default:
        fmt.Println("Unknown type. Sorry!")
}
Salin selepas log masuk

Sekiranya kegagalan dibenarkan, bagaimanakah ia dijangka akan bertindak? Dalam kes bool, i ditaip sebagai bool. Walau bagaimanapun, dalam kes rentetan, i menjadi ditaip sebagai rentetan.

Membenarkan fallthrough memerlukan sama ada morphing jenis ajaib (mustahil) atau bayang-bayang berubah (tanpa nilai bermakna). Pertimbangkan contoh berikut:

switch i := x.(type) {
    case int:
        // i is an int
        fmt.Printf("%T\n", i); // prints "int"
    case bool:
        // i is a bool
        fmt.Printf("%T\n", i); // prints "bool"
        fallthrough
    case string:
        fmt.Printf("%T\n", i);
        // What is the type here? Should be "string", but what if it falls through from bool?
}
Salin selepas log masuk

Satu-satunya penyelesaian yang mungkin adalah dengan melakukan kesilapan secara tersirat menghantar kes berikutnya ke antara muka{}, tetapi ini akan mengelirukan dan tidak jelas.

Jika gelagat semakan jenis yang diingini untuk ungkapan kes suis adalah penting, ia boleh dilaksanakan dengan kefungsian sedia ada:

switch i := x.(type) {
    case bool, string:
        if b, ok := i.(bool); ok {
            // b is a bool
        }
        // i is an interface{} that contains either a bool or a string
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Fallthrough Tidak Dibenarkan dalam Suis Jenis Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan