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

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

go 方法 - 指針接收器并返回相同的指針

go 方法 - 指針接收器并返回相同的指針

Go
千巷貓影 2023-08-07 11:16:15
結構體上的 go 方法接收指針引用,進行一些修改并返回相同的指針。該結構具有相同結構的嵌套引用:當使用值調用追加方法時,由于某種原因它會丟失以前的值。package mainimport (    "fmt")type Node struct{    next *Node    val int}func newNode(val int) (*Node){    n := Node{    val: val,    }   return &n}func (n *Node) append(val int) (*Node){      for n.next != nil {     n = n.next      }      n.next = newNode(val)     return n}func (n *Node)printList(){    for n != nil {         fmt.Printf("%d,", n.val)         n = n.next    }    fmt.Println()}func main() {   n := newNode(3)   n.printList()   n = n.append(4)   n.printList()   n = n.append(5)   n.printList()   n = n.append(6)   n.printList()    }output:3,3,4,4,5,5,6,我本來期待 3,4,5,6,- 可能是我完全錯過了一些基本知識。如果您有一些意見,我們將不勝感激。https://play.golang.org/p/-zDH98UNFLa當我修改追加方法時,我得到了預期的結果,但沒有返回任何內容。
查看完整描述

3 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

append()返回下一個節點的指針。因此printList(),僅打印從下一個節點開始的節點。如果您想打印列表中的所有節點,您應該添加一個變量來存儲引用該列表起始節點的指針。


func main() {

    n := newNode(3)


    head := n

    head.printList()


    n = n.append(4)

    head.printList()


    n = n.append(5)

    head.printList()


    n = n.append(6)

    head.printList() // 3,4,5,6

}


查看完整回答
反對 回復 2023-08-07
?
小唯快跑啊

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

這個功能:


func (n *Node) append(val int) (*Node){

      for n.next != nil {

     n = n.next

      }

      n.next = newNode(val)

     return n

}

一般不返回其原始參數。它返回(假設非空)列表中倒數第二個節點。因此:


n = n.append(4)

添加一個節點holding4到原始節點holding 3,然后返回原始節點holding 3,但是:


n = n.append(5)

將持有 的節點添加5到原始列表,但隨后返回指向持有 的節點的指針4。這就是你4,5,現在看到的原因。出于同樣的原因,后續調用會不斷重復最后兩個元素。


您可以修改您的append函數以保存原始返回值并返回該值:


func (n *Node) append(val int) *Node {

    // find current tail

    t := n

    for t.next != nil {

        t = t.next

    }

    t.next = newNode(val)

    return n

}

但總的來說,這仍然不是一個很好的策略:例如,當給定-valued時,這append不起作用??紤]構建一個能夠處理此類情況的列表類型?;蛘?,正如Hsaio 的回答一樣,您可以讓調用者直接掛在頭節點上。如果你這樣做,你可以讓函數返回尾指針:nilnappend


func (n *Node) append(val int) *Node {

    n.next = newNode(val)

    return n.next

}

然后像這樣使用它:


head := newNode(3)

t := append(head, 4)

t = append(t, 5)

t = append(t, 6)

head.printList()

List(標準 Go 包中已經有一個container/list實現,它可以很好地為您完成這些工作。您可以創建一個整體列表容器實例,而不是直接指向列表中的每個元素,該實例允許您在前面插入, insert-at-back、remove-from-anywhere 等等。這有點尷尬,因為它用于interface{}數據,因此需要類型斷言來獲取每個節點的值。)


查看完整回答
反對 回復 2023-08-07
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

n函數中的變量main被函數n中的變量覆蓋append。



查看完整回答
反對 回復 2023-08-07
  • 3 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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