我正在尝试创建一个新结构并将其原始值用作新结构的成员。但是,它们最终都是相同的引用(即payload和payload.prev),这会导致我的代码中的无限递归。我感谢任何帮助或提示。package maintype Sieve struct { prime int prev *Sieve}func Test(payload *Sieve, n int) { if payload.prime*(n/payload.prime) == n { } else if payload.prev == nil { println(n) // payload and payload.prev end up being the same reference // and it causes infinite loop *payload = Sieve{ prime: n, prev: payload, } } else { Test(payload.prev, n) }}func main() { var p = Sieve{ prev: nil, prime: 2, } println(2) for i := 2; i < 10; i++ { Test(&p, i) }}
3 回答
守着一只汪
TA贡献1872条经验 获得超3个赞
您想更新“有效负载”指针以指向新结构的地址。像这样构造你的新结构:
payload = &Sieve{ prime: n, prev: payload, }
开心每一天1111
TA贡献1836条经验 获得超13个赞
在覆盖Sieve指向的结构之前,payload复制它:
p := *payload
现在您可以分配一个新的Sieve结构值,将副本的地址存储为其prev字段:
*payload = Sieve{
prime: n,
prev: &p,
}
通过此更改,您的应用程序将运行并正确输出 2 到 10 之间的素数(在Go Playground上尝试):
2
3
5
7
婷婷同学_
TA贡献1844条经验 获得超8个赞
使用下面的代码,您不是在创建 的新实例Sieve,而是将现有的实例设置Sieve为指向自身:
*payload = Sieve{
prime: n,
prev: payload,
}
如果你想把payload一层往下推,你可以这样做:
p:=*payload
*payload = Sieve {
prime: n,
prev: &p}
这将首先分配payloadto的内容p,然后将payload内容重写为指向p。
另一方面,如果你想创建一个新的payload指向旧的,使用:
payload = Sieve {
prime: n,
prev: payload }
然后你必须返回/使用这个新payload指针。
- 3 回答
- 0 关注
- 121 浏览
添加回答
举报
0/150
提交
取消