首頁  >  文章  >  後端開發  >  為什麼 Go 的型別切換不允許 Fallthrough?

為什麼 Go 的型別切換不允許 Fallthrough?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-12 19:54:02702瀏覽

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

型切換中的 Fallthrough:為什麼不允許?

問題:

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn