首頁 >後端開發 >Golang >Go 中的類型斷言:為什麼「無法在非介面值上進行類型切換」以及如何修復?

Go 中的類型斷言:為什麼「無法在非介面值上進行類型切換」以及如何修復?

Susan Sarandon
Susan Sarandon原創
2024-11-13 10:56:02438瀏覽

Type Assertion in Go: Why

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 是指向 Number 結構的指針,它不是介面。

解決方案是在嘗試類型斷言之前將值強制轉換為 interface{}。這是因為類型斷言只能對介面值執行。這是修正後的程式碼:

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

現在,當您執行程式碼時,它將列印「Stringer:1」。這是因為將 n 強制轉換為 interface{} 允許將其視為類型斷言的介面值。

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

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