亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 nil 接口轉換為 Golang 中某物的指針?

將 nil 接口轉換為 Golang 中某物的指針?

Go
慕的地6264312 2021-10-04 17:13:38
在以下代碼段中,嘗試將 nil 接口轉換為某事物的指針失敗并出現以下錯誤: interface conversion: interface is nil, not *main.Nodetype Nexter interface {    Next() Nexter}type Node struct {    next Nexter}func (n *Node) Next() Nexter {...}func main() {    var p Nexter    var n *Node    fmt.Println(n == nil) // will print true    n = p.(*Node) // will fail}播放鏈接在這里:https : //play.golang.org/p/2cgyfUStCI為什么這會失???完全有可能做到n = (*Node)(nil),所以我想知道如何從 nil 界面開始實現類似的效果。
查看完整描述

1 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

這是因為靜態類型的變量Nexter(它只是一個接口)可能包含許多不同動態類型的值。


是的,由于*Nodeimplements Nexter,您的p變量可能包含 type 的值*Node,但它也可能包含其他類型的implementation Nexter;或者它可能什么都沒有(nil價值)。和類型斷言這里不能使用,因為從規格報價:


x.(T)斷言x是不nil和存儲在值x是類型的T。


但x在你的情況下是nil. 如果類型斷言為假,則會發生運行時恐慌。


如果你改變你的程序來初始化你的p變量:


var p Nexter = (*Node)(nil)

您的程序將運行并且類型斷言成功。這是因為接口值實際上以 : 的形式保存一對(value, dynamic type),在這種情況下,您p不會是nil,但會保存一對(nil, *Node); 有關詳細信息,請參閱反射定律 #接口的表示。


如果你還想處理nil接口類型的值,你可以像這樣明確地檢查它:


if p != nil {

    n = p.(*Node) // will not fail IF p really contains a value of type *Node

}

或者更好:使用特殊的“逗號確定”形式:


// This will never fail:

if n, ok := p.(*Node); ok {

    fmt.Printf("n=%#v\n", n)

}

使用“逗號確定”形式:


如果斷言成立,ok則值為is true。否則,它false的值n是 type 的零值T。在這種情況下不會發生運行時恐慌。


查看完整回答
反對 回復 2021-10-04
  • 1 回答
  • 0 關注
  • 265 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號