如何创建新结构并将其原始值用作新结构的成员
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建新结构并将其原始值用作新结构的成员相关的知识,希望对你有一定的参考价值。
我正在尝试创建新结构并将其原始值用作新结构的成员。但是,它们最终都是相同的引用(即payload
和payload.prev
),这会在我的代码中造成无限递归。感谢您的帮助或提示。
package main
type 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)
}
}
答案
覆盖Sieve
指向的payload
结构之前,请对其进行复制:
p := *payload
现在您可以分配一个新的Sieve
结构值,将副本的地址存储为其prev
字段:
*payload = Sieve{
prime: n,
prev: &p,
}
进行此更改后,您的应用会运行并正确输出2到10之间的质数(在Go Playground上尝试):
2
3
5
7
另一答案
您想更新“有效载荷”指针以指向新结构的地址。像这样构造新的结构:
payload = &Sieve{
prime: n,
prev: payload,
}
另一答案
使用下面的代码,您没有创建Sieve
的新实例,而是将Sieve
的现有实例设置为指向自身:
*payload = Sieve{
prime: n,
prev: payload,
}
如果您想将payload
向下推一个级别,您可以这样做:
p:=*payload
*payload = Sieve {
prime: n,
prev: &p}
[这首先将payload
的内容分配给p
,然后重写payload
的内容以指向p
。
另一方面,如果要创建一个指向旧版本的新payload
,请使用:
payload = Sieve {
prime: n,
prev: payload }
然后您必须返回/使用此新的payload
指针。
以上是关于如何创建新结构并将其原始值用作新结构的成员的主要内容,如果未能解决你的问题,请参考以下文章