Mengapa Fallthrough Tidak Dibenarkan dalam Suis Jenis Go?

Mary-Kate Olsen
Lepaskan: 2024-11-13 03:57:02
asal
411 orang telah melayarinya

Why is Fallthrough Disallowed in Go's Type Switch?

Fallthrough dalam Suis Jenis: Penjelasan Mendalam

Pensuisan jenis dalam Go membolehkan pengendalian nilai yang cekap berdasarkan jenis konkritnya. Walau bagaimanapun, tidak seperti dalam penyataan kes suis standard, kegagalan secara eksplisit tidak dibenarkan dalam suis jenis. Pilihan reka bentuk ini menimbulkan persoalan tentang rasionalnya.

Memahami Sebab

Spesifikasi Go menyatakan bahawa "fallthrough" tidak dibenarkan dalam suis jenis. Larangan ini berpunca daripada beberapa faktor:

  • Ketidakpadanan Jenis: Dalam suis jenis, pembolehubah yang dinilai menukar jenis bergantung pada cawangan kes yang dimasukkan. Sebagai contoh, jika pembolehubah diberikan boolean dalam satu cawangan dan rentetan dalam yang lain, fallthrough akan mengakibatkan jenis tidak padan.
  • Gelagat Mengelirukan: Membenarkan fallthrough dalam suis jenis akan memperkenalkan samar-samar semantik. Pertimbangkan suis di mana pembolehubah diberikan boolean dalam cawangan sebelumnya. Jika kegagalan dibenarkan, tidak jelas cara pembolehubah itu harus ditangani di cawangan berikutnya. Sekiranya ia kekal sebagai boolean atau menjadi antara muka{} yang memegang sama ada boolean atau nilai jenis baharu?

Contoh untuk Penjelasan

Untuk menggambarkan masalahnya, pertimbangkan kod berikut:

switch i := x.(type) {
case int:
    fmt.Printf("%T\n", i) // prints "int"
case bool:
    fmt.Printf("%T\n", i) // prints "bool"
    fallthrough
case string:
    fmt.Printf("%T\n", i)
}
Salin selepas log masuk

Jika gagal dibenarkan, tidak jelas jenis yang akan dicetak untuk sarung rentetan. Ia akan menjadi samar-samar sama ada saya harus kekal sebagai boolean atau menjadi antara muka{} yang mengandungi kedua-dua boolean dan rentetan.

Penyelesaian Alternatif

Sementara fallthrough tidak dibenarkan masuk suis jenis, terdapat cara alternatif untuk mencapai gelagat yang serupa:

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

Pendekatan ini membolehkan pengendalian yang lebih khusus bagi jenis yang berbeza tanpa memperkenalkan jenis yang tidak sepadan atau kesamaran.

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