我正在嘗試創建一個新結構并將其原始值用作新結構的成員。但是,它們最終都是相同的引用(即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條經驗 獲得超4個贊
您想更新“有效負載”指針以指向新結構的地址。像這樣構造你的新結構:
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 關注
- 150 瀏覽
添加回答
舉報
0/150
提交
取消