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

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

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

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

Go
忽然笑 2022-04-26 14:50:01
為了說明問題:假設您有以下結構,其中包含用于打印內容的方法 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()}上述執行將在最終循環中出錯,因為我嘗試使用此輸出取消引用 nil:2 ->4 ->3 ->panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x109ae6f]但是,將函數更改為指針接收器,它優雅地變為:func (l *ListNode) display() {    for l != nil {        fmt.Printf("%v ->", l.Val)        l = l.Next    }    fmt.Println()}有一個快樂的輸出:2 ->4 ->3 ->作為一個“新手”,我認為由于該display()函數是只讀的,最好用值接收器編寫函數,但會遇到這個問題。是否有一個更優雅的解決方案與我缺少的值接收器或在原始函數中取消引用的更好方法?
查看完整描述

3 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

像這樣測試值接收器的地址以查看它是否為 nil 是沒有意義的:


 for &l != nil {

這里,l是一個有值的變量,它永遠不能為零。


如果你得到一個指針接收器,這會做到,并且即使l是 nil 也能工作:


func (l *ListNode) display() {

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

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

    }

}

如果你得到一個值接收器:


func (l ListNode) display() {

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

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

    }

}


查看完整回答
反對 回復 2022-04-26
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

你有一個值接收器的事實并沒有改變你有指針字段的事實。而且您不需要將他們的形式強制為接收者的形式(值/指針)。它們可以保持指針。無需取消引用(明確地)。


func (l ListNode) display() {

    curNode := &l

    for curNode != nil {

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

        curNode = curNode.Next

    }

    fmt.Println()

}


查看完整回答
反對 回復 2022-04-26
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

某種遞歸解決方案


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

}


查看完整回答
反對 回復 2022-04-26
  • 3 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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