第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將 nil 接口轉(zhuǎn)換為 Golang 中某物的指針?

將 nil 接口轉(zhuǎn)換為 Golang 中某物的指針?

Go
慕的地6264312 2021-10-04 17:13:38
在以下代碼段中,嘗試將 nil 接口轉(zhuǎn)換為某事物的指針失敗并出現(xiàn)以下錯(cuò)誤: 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為什么這會(huì)失敗?完全有可能做到n = (*Node)(nil),所以我想知道如何從 nil 界面開始實(shí)現(xiàn)類似的效果。
查看完整描述

1 回答

?
阿波羅的戰(zhàn)車

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í)恐慌。


查看完整回答
反對(duì) 回復(fù) 2021-10-04
  • 1 回答
  • 0 關(guān)注
  • 228 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)