gpt4 book ai didi

pointers - 在指针接收器方法中更新值,但值不更新

转载 作者:行者123 更新时间:2023-12-01 22:25:47 25 4
gpt4 key购买 nike

我正在Go中实现一个链表。我编写了一种在链表的开头插入节点的方法:

func (n *node) insertAtBegining(d int){
nn := &node{d,n}
n = nn
}

作为指针接收器的方法应更新节点 n,但无法这样做。

例如,
head.printList()
head.insertAtBegining(30)
head.printList()

退货
42 -> 56 -> 89 -> nil
42 -> 56 -> 89 -> nil

您可以在 https://play.golang.org/p/rpI6lbAywOQ上看到完整的实现。

我究竟做错了什么?

最佳答案

问题的根源在于,调用head.insertAtBegining(30)不会更改head的值(它仍然指向node{42, nil})。

您是基于n = nn中的insertAtBegining将更新head的假设而开发的,但事实并非如此。我认为insertAtBegining是标准函数而不是method更容易理解:

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中采用的方法。这样做的好处是用户不需要了解列表的存储方式。

关于pointers - 在指针接收器方法中更新值,但值不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60015224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com