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。在這種情況下不會發生運行時恐慌。
- 1 回答
- 0 關注
- 265 瀏覽
添加回答
舉報
