Go 中具有多種情況的類型開關
當使用具有多種情況的類型開關時,可能會遇到錯誤,指出變數具有多種類型的情況是未定義的。此行為源自於 Go 語言規範,該規範規定類型切換保護可以包含簡短的變數聲明。
在這種情況下,變數的類型與單一類型情況中列出的類型相同。但是,在具有多種類型清單的情況下,變數具有類型開關保護中表達式的類型。
為了說明這一點,請考慮以下程式碼:
type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } var foo interface{} foo = A{} switch a := foo.(type) { case B, A: a.test() }
執行此程式碼將導致錯誤「a.test undefined(類型interface {}是沒有方法的介面)」。這是因為變數 a 具有類型 interface{},而不是特定情況的類型。
要解決此問題,可以斷言類型開關保護表達式具有預期的方法。例如:
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() 方法,如果有,則將 foo 的值賦給 a 並呼叫 test() 方法。
以上是為什麼 Go 中具有多個 case 的類型切換會導致「未定義」變數錯誤,如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!