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