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

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

檢查 nil 指針取消引用的正確方法是什么?

檢查 nil 指針取消引用的正確方法是什么?

Go
月關(guān)寶盒 2023-08-14 16:25:03
為了說明這個(gè)問題:假設(shè)您有以下結(jié)構(gòu)體,其中包含用于打印內(nèi)容的方法 display (值接收器):type ListNode struct {    Val  int    Next *ListNode}func (l ListNode) display() {    for &l != nil {        fmt.Printf("%v ->", l.Val)        l = *l.Next    }    fmt.Println()}func main() {    num1 := ListNode{2, &ListNode{4, &ListNode{3, nil}}}    num1.display()}上面的執(zhí)行將在最后一個(gè)循環(huán)中出錯(cuò),因?yàn)槲覈L試使用以下輸出取消引用 nil:2 ->4 ->3 ->panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x109ae6f]然而,將函數(shù)更改為指針接收器,它會(huì)優(yōu)雅地變?yōu)椋篺unc (l *ListNode) display() {    for l != nil {        fmt.Printf("%v ->", l.Val)        l = l.Next    }    fmt.Println()}愉快的輸出:2 ->4 ->3 ->作為一個(gè)“新手”,我認(rèn)為由于該display()函數(shù)是只讀的,因此最好使用值接收器編寫該函數(shù),但遇到了這個(gè)問題。是否有一個(gè)更優(yōu)雅的解決方案以及我缺少的值接收器或在原始函數(shù)中取消引用的更好方法?
查看完整描述

4 回答

?
炎炎設(shè)計(jì)

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊

像這樣測(cè)試值接收者的地址來查看它是否為 nil 是沒有意義的:


 for &l != nil {

這里,l是一個(gè)有值的變量,它永遠(yuǎn)不能為零。


如果你有一個(gè)指針接收器,這將做到這一點(diǎn),并且即使在lnil 時(shí)也能工作:


func (l *ListNode) display() {

   for trc:=l; trc!=nil; trc=trc.Next {

        fmt.Printf("%v ->", trc.Val)

    }

}

如果你得到一個(gè)值接收者:


func (l ListNode) display() {

   for trc:=&l; trc!=nil; trc=trc.Next {

        fmt.Printf("%v ->", trc.Val)

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-08-14
?
繁花不似錦

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊

以下是指針取消引用:


v = *ptr

如果 ptr 為零,這將崩潰。在取消引用之前檢查是否為零。


if ptr != nil {

    v = *ptr

    // ...... 

}


查看完整回答
反對(duì) 回復(fù) 2023-08-14
?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

您擁有值接收器的事實(shí)不會(huì)改變您擁有指針字段的事實(shí)。并且您不需要將它們的形式強(qiáng)制為接收者的形式(值/指針)。他們可以保留指針。無需(顯式)取消引用。


func (l ListNode) display() {

    curNode := &l

    for curNode != nil {

        fmt.Printf("%v ->", curNode.Val)

        curNode = curNode.Next

    }

    fmt.Println()

}


查看完整回答
反對(duì) 回復(fù) 2023-08-14
?
慕標(biāo)琳琳

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊

某種遞歸解決方案


package main


import "fmt"


type ListNode struct {

    Val  int

    Next *ListNode

}


func (l *ListNode) display() {

    if l != nil {

        fmt.Printf("%v ->", l.Val)

        l.Next.display()

    }

    fmt.Println()

}


func main() {

    num1 := &ListNode{2, &ListNode{4, &ListNode{3, nil}}}


    num1.display()

}


查看完整回答
反對(duì) 回復(fù) 2023-08-14
  • 4 回答
  • 0 關(guān)注
  • 218 瀏覽

添加回答

舉報(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)