1 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是因?yàn)殪o態(tài)類型的變量Nexter(它只是一個(gè)接口)可能包含許多不同動(dòng)態(tài)類型的值。
是的,由于*Nodeimplements Nexter,您的p變量可能包含 type 的值*Node,但它也可能包含其他類型的implementation Nexter;或者它可能什么都沒有(nil價(jià)值)。和類型斷言這里不能使用,因?yàn)閺囊?guī)格報(bào)價(jià):
x.(T)斷言x是不nil和存儲(chǔ)在值x是類型的T。
但x在你的情況下是nil. 如果類型斷言為假,則會(huì)發(fā)生運(yùn)行時(shí)恐慌。
如果你改變你的程序來初始化你的p變量:
var p Nexter = (*Node)(nil)
您的程序?qū)⑦\(yùn)行并且類型斷言成功。這是因?yàn)榻涌谥祵?shí)際上以 : 的形式保存一對(duì)(value, dynamic type),在這種情況下,您p不會(huì)是nil,但會(huì)保存一對(duì)(nil, *Node); 有關(guān)詳細(xì)信息,請(qǐng)參閱反射定律 #接口的表示。
如果你還想處理nil接口類型的值,你可以像這樣明確地檢查它:
if p != nil {
n = p.(*Node) // will not fail IF p really contains a value of type *Node
}
或者更好:使用特殊的“逗號(hào)確定”形式:
// This will never fail:
if n, ok := p.(*Node); ok {
fmt.Printf("n=%#v\n", n)
}
使用“逗號(hào)確定”形式:
如果斷言成立,ok則值為is true。否則,它false的值n是 type 的零值T。在這種情況下不會(huì)發(fā)生運(yùn)行時(shí)恐慌。
- 1 回答
- 0 關(guān)注
- 228 瀏覽
添加回答
舉報(bào)