首頁 > 後端開發 > Golang > 為什麼 Go 中具有多個 case 的類型切換會導致「未定義」方法錯誤?

為什麼 Go 中具有多個 case 的類型切換會導致「未定義」方法錯誤?

Patricia Arquette
發布: 2024-12-18 14:42:09
原創
137 人瀏覽過

Why Does a Type Switch with Multiple Cases in Go Result in an

Go 中具有多種大小寫的類型開關

在 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板