問題:
在 Go 中,嘗試使用 Fallthrough 語句在型別開關中會引發錯誤。為什麼在這種情況下不允許fallthrough?
答案:
在類型切換中,被切換的變數會根據執行的具體情況而改變類型。例如,以下程式碼中的變數 i 的類型取決於呼叫的情況:
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!") }
如果允許失敗,那麼它的行為會如何?對於 bool,i 的型別為 bool。但是,在字串的情況下,i 會被鍵入為字串。
允許失敗需要魔法類型變形(不可能)或變數陰影(沒有有意義的值)。請考慮以下範例:
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? }
唯一可能的解決方案是讓fallthrough將後續案例隱式轉換為interface{},但這會令人困惑且定義不明確。
如果 switch-case 表達式所需的類型檢查行為是必需的,則可以使用現有功能來實現:
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 }
以上是為什麼 Go 的型別切換不允許 Fallthrough?的詳細內容。更多資訊請關注PHP中文網其他相關文章!