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

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-13 03:57:02442瀏覽

Why is Fallthrough Disallowed in Go's Type Switch?

類型切換的失敗:深入解釋

Go 中的類型切換允許根據值的具體類型高效處理值。然而,與標準 switch-case 語句不同的是,在類型 switch 中明確不允許使用fallthrough。這種設計選擇引發了對其基本原則的質疑。

理解原因

Go 規範規定類型開關中不允許「fallthrough」。此禁止源自於多個因素:

  • 類型不符: 在類型切換中,正在評估的變數根據輸入的 case 分支更改類型。例如,如果變數在一個分支中分配了一個布林值,在另一個分支中分配了一個字串,則fallthrough將導致類型不匹配。
  • 令人困惑的行為:允許類型切換中的fallthrough會引入歧義語義。考慮一個開關,其中變數在前一個分支中被分配了布林值。如果允許失敗,則不清楚在後續分支中應如何處理該變數。它應該保留為布林值還是成為保存布林值或新類型值的介面?

澄清範例

用來說明問題,請考慮以下程式碼:

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)
}

如果允許失敗,則不清楚是什麼類型為字串大小寫列印。我是否應該保留布林值或成為同時包含布林值和字串的介面{}是不明確的。

替代解決方案

雖然不允許失敗類型開關,還有其他方法可以實現類似的行為:

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