在 Go 中,類型開關允許您將一個值與多個類型進行匹配。然而,當在類型切換中使用多種情況時,理解變數類型賦值變得至關重要。
考慮以下程式碼片段:
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = A{} switch a := foo.(type) { case B, A: a.test() } }
執行此程式碼時,會引發錯誤: .test undefined(類型interface {}是沒有方法的介面)。發生此錯誤的原因是,儘管有類型切換,變數 a 仍保留了類型 interface{}。
要理解此行為,我們需要參考Go 規範:
「TypeSwitchGuard 可能包括當使用該形式時,變數在每個子句中的隱式區塊的開頭聲明,而在case中,該變數具有該類型;否則,該變數具有該類型。子句中指定了多種類型(B 和 A),因此變數 a 保留 TypeSwitchGuard 中表達式的類型,即 interface{}。這意味著編譯器不允許我們在 a 上調用 test() 方法,因為 interface{} 沒有 test() 方法。
為了解決這個問題,我們可以使用型別斷言,它允許我們斷言一個值具有特定型別。這是使用型別斷言的程式碼的更新版本:
以上是為什麼 Go 中具有多個 case 的類型切換會導致「未定義」方法錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!