Go 類型切換中的多種情況
將介面值指派給型別切換變數時,結果型別取決於狀況清單結構。 switch-case 語句中的多個 case 清單可能會導致意外行為。
在您提供的程式碼片段中:
switch a := foo.(type){ case B, A: a.test() }
出現錯誤是因為變數 a 的類型是 interface{} ,而不是 A 或 B。這是因為 case 清單包含多種類型,所以 a 的類型與介面表達式 (foo) 的類型保持一致。
要解析這樣,case 列表應該只包含單一類型:
switch a := foo.(type){ case A: a.test() }
透過將 case 列表限制為特定類型,變數 a 將具有預期的類型,從而允許方法呼叫成功。
或者,您可以使用斷言表達式明確斷言介面類型:
if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() }
在這種情況下,變數a 僅具有預期類型,如果斷言成功(即ok 為true )。
以上是Go 類型開關中的多個情況如何導致意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!