將Nil 介面轉換為Golang 中類型的指標
當嘗試將nil 介面轉換為特定類型的指標時,發生錯誤: 「介面轉換:介面為零」。要理解為什麼會失敗,重要的是要掌握靜態類型和動態類型之間的差異。
Nexter 是一個接口,它指定靜態類型。 Nexter 類型的變數可以保存實作 Nexter 介面的各種動態類型的值,例如 *Node 或其他自訂類型。當將 nil 介面變數指派給指標變數時,無法確定它所保存的值的實際動態類型(因為它不保存任何值)。
因此,型別斷言通常用於x.(T) 形式斷言 x 的型別為 T 並將其轉換為 T,失敗。這是因為 Go 語言的規範明確規定 x.(T) 只有在 x 不為 nil 時才有效。在 nil 介面變數上使用類型斷言將導致運行時恐慌。
要實現與n = p.(*Node) 類似的效果,但從nil 介面開始,可以使用以下方法:
var p Nexter = (*Node)(nil)
介面值實際上保存一對(值,動態型別)。在這種情況下,p 不是 nil,而是包含一對 (nil, *Node)。這允許 p 上的型別斷言成功。
或者,要明確處理nil 值,請使用「comma-ok」形式:
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) }
「comma-ok」形式確保不會發生運行時恐慌,如果斷言失敗(即p 持有nil 值或不同類型的值),則ok 將為false。
以上是如何在 Go 中安全地將 Nil 介面轉換為指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!