首頁  >  文章  >  後端開發  >  為什麼我在 Go 中收到「無法在非介面值上進行類型切換」?

為什麼我在 Go 中收到「無法在非介面值上進行類型切換」?

Patricia Arquette
Patricia Arquette原創
2024-11-09 20:32:02704瀏覽

Why Am I Getting

Go 中的錯誤處理:解決「無法在非介面值上進行類型切換」

在嘗試在Go 中實現類型斷言時,您可能會遇到錯誤訊息:「無法在非介面值上鍵入switch」。當嘗試對不是介面類型的值執行類型切換時,會出現此錯誤。

考慮以下程式碼片段:

package main

import "fmt"
import "strconv"

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")
    }
}

執行此程式碼時,您將遇到「無法在非介面值上鍵入 switch」錯誤。為了解決這個問題,我們需要在執行類型轉換之前將變數 n 轉換為 interface{} 類型。

switch v := interface{}(n).(type)

此轉換將 n (*Number) 的特定型別轉換為介面類型 interface{ }。 Go 中的介面充當契約,允許透過通用方法儲存和存取任何值。透過將 n 轉換為 interface{},我們可以對產生的介面值執行類型切換。

當我們執行修改後的程式碼時,它將成功列印“Stringer: 1”,如預期的那樣。這表示 Go 中的類型斷言要求值是介面類型,並且轉換為 interface{} 可以在非介面值上進行類型切換。

以上是為什麼我在 Go 中收到「無法在非介面值上進行類型切換」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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