多種 Case 的型別切換
Go 中可以使用 type switch 語句依照不同的型別動態選擇對應的 case一個值。當在單一情況下指定多個類型時,如果值的類型與任何列出的類型都不匹配,則可能會引發錯誤。
考慮以下程式碼片段:
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() } }
此程式碼執行時,會產生以下錯誤:
a.test undefined (type interface {} is interface with no methods)
此錯誤表示變數類型切換沒有生效,因為變數a的型別為interface{},它沒有test() 方法。
Go 語言規範解釋說,在類型switch 語句中,當一個case 中指定了多個類型時,該case 中聲明的變數將具有類型開關保護中表達式的類型(在本例中為foo)。由於 foo 是 interface{} 類型,所以 a 也會變成 interface{} 類型。
要解決這個問題並確保test() 方法可以被調用,您可以明確斷言foo 具有test( ) 方法,然後執行類型切換,如下所示:
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } type tester interface { test() } func main() { var foo interface{} foo = &B{} if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() } }
透過斷言foo 具有test() 方法,您可以檢索適當類型的值並呼叫test() 方法成功了。
以上是如何在Go的類型切換中正確使用多案例以避免方法錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!