首頁  >  文章  >  後端開發  >  為什麼 Go 會拋出「無法在非介面值上鍵入切換」錯誤?

為什麼 Go 會拋出「無法在非介面值上鍵入切換」錯誤?

DDD
DDD原創
2024-11-17 11:37:02870瀏覽

Why Does Go Throw a

Go 中的類型斷言:解決「無法在非介面值上進行類型切換」

在Go 中,類型斷言涉及檢查某個值是否存在屬於特定類型。當遇到錯誤「cannot type switch on non-interface value」時,這表示正在檢查的值不是介面。

考慮以下程式碼:

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}

此程式碼嘗試在值 n 上鍵入 switch,該值的類型為 *Number。但是,它會導致“無法在非介面值上鍵入 switch”錯誤。

要解決此問題,我們需要在執行類型斷言之前將 n 轉換為介面值。這是因為類型切換只能對介面值進行。以下更正後的程式碼示範了這一點:

switch v := interface{}(n).(type) {
case Stringer:
    fmt.Println("Stringer:", v)
default:
    fmt.Println("Unknown")
}

透過將 n 強制轉換為 interface{},我們允許對產生的介面值執行類型切換。這使我們能夠成功檢查 n 是否為 Stringer 類型並列印相應的訊息。

以上是為什麼 Go 會拋出「無法在非介面值上鍵入切換」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn