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

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

在指針接收器方法中更新值但值未更新

在指針接收器方法中更新值但值未更新

Go
慕的地8271018 2022-05-10 17:08:49
我在 Go 中實現了一個鏈表。我寫了一個在鏈表開頭插入節點的方法:func (n *node) insertAtBegining(d int){    nn := &node{d,n}    n = nn}作為指針接收器的方法應該更新節點n,但它沒有這樣做。例如,head.printList()head.insertAtBegining(30)head.printList()返回42 -> 56 -> 89 -> nil42 -> 56 -> 89 -> nil你可以在https://play.golang.org/p/rpI6lbAywOQ看到完整的實現。我究竟做錯了什么?
查看完整描述

1 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

問題的根源是調用head.insertAtBegining(30)不會改變 head 的值(它仍然指向node{42, nil})。


你已經開發了這個假設n = nnininsertAtBegining會更新head,但事實并非如此。我認為如果insertAtBegining是標準函數而不是方法更容易理解:


insertAtBegining(head, 30)

...

func insertAtBegining(n *node, d int) *node{

    nn := &node{d,n}

    n = nn

}

由于 Go 通過值傳遞所有參數(您可以傳遞一個指針,但它作為一個值傳遞)我認為很明顯這不會改變head(如果你想這樣做,你需要定義函數func insertAtBegining(n **node, d int) *node{并傳遞它&head。


您的方法中的問題是相同的。


最簡單的解決方法是重新定義insertAtBegining為(playground):


func (n *node) insertAtBegining(d int) *node{

    nn := &node{d,n}

    return nn

}

它現在返回新的頭部,所以你可以像這樣使用它head = head.insertAtBegining(30):


另一種方法是將列表管理封裝在一個結構中;這是在list.List中采用的方法。這樣做的好處是用戶不需要了解列表是如何存儲的。


查看完整回答
反對 回復 2022-05-10
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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