Mengapa Fallthrough Tidak Dibenarkan dalam Suis Jenis Go?

Mary-Kate Olsen
Lepaskan: 2024-11-12 19:54:02
asal
648 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!

sumber:php.cn
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