首頁 > 後端開發 > Golang > 為什麼在 Golang 中出現「無法在非介面值上鍵入切換」錯誤?

為什麼在 Golang 中出現「無法在非介面值上鍵入切換」錯誤?

Susan Sarandon
發布: 2024-11-13 04:40:02
原創
931 人瀏覽過

Why Do I Get the

Golang 中的錯誤:「無法在非介面值上進行類型切換」

使用類型斷言時,您可能會遇到錯誤「無法在非介面值上鍵入switch。」當嘗試對不是介面的值執行類型切換時,會發生這種情況。

在 Golang 中,類型切換可讓您根據變數的類型有條件地執行程式碼。但是,它要求變數是介面類型。介面表示一個契約,它定義了實作類型必須實作的一組方法。

在提供的程式碼片段中,使用單一 String() 方法定義了名為 Stringer 的類型。 Number 類型也實作了 String() 方法,使其成為 Stringer 介面的具體實作。

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}
登入後複製

但是,錯誤發生在 main 函數中,其中嘗試對 n 變數進行類型切換,其類型為 *Number 而不是 Stringer。

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

要解決此問題,您需要在執行類型斷言之前將 n 強制轉換為 interface{}。這是因為 interface{} 可以表示任意值。

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

透過將 n 強制轉換為 interface{},本質上允許類型切換考慮 n 可能是 Stringer 類型的可能性。一旦輸入類型開關,就可以確定 n 的實際類型並執行適當的 case 分支。

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

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