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!") }
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? }
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 }
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!