Pointers 如何创建新结构并将其原始值用作新结构的成员
我正在尝试创建一个新结构,并将其原始值用作新结构的成员。但是,它们最终都是相同的引用(即Pointers 如何创建新结构并将其原始值用作新结构的成员,pointers,go,recursion,struct,Pointers,Go,Recursion,Struct,我正在尝试创建一个新结构,并将其原始值用作新结构的成员。但是,它们最终都是相同的引用(即有效载荷和有效载荷.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
有效载荷
和有效载荷.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)
}
}
主程序包
型筛结构{
素数整型
上筛
}
功能测试(有效载荷*筛,n int){
如果有效载荷.prime*(n/有效载荷.prime)==n{
}否则,如果payload.prev==nil{
println(n)
//payload和payload.prev最终是同一个引用
//它会导致无限循环
*有效载荷=筛子{
素数:n,
上一页:有效载荷,
}
}否则{
测试(有效载荷前,n)
}
}
func main(){
var p=筛子{
上一页:无,
总理:2,,
}
println(2)
对于i:=2;i<10;i++{
测试(&p,i)
}
}
您希望更新“有效负载”指针以指向新结构的地址。按如下方式构造新结构:
payload = &Sieve{
prime: n,
prev: payload,
}
您希望更新“有效负载”指针,以指向新结构的地址。按如下方式构造新结构:
payload = &Sieve{
prime: n,
prev: payload,
}
使用下面的代码,您不是在创建
Sieve
的新实例,而是将Sieve
的现有实例设置为指向自身:
*payload = Sieve{
prime: n,
prev: payload,
}
如果要将有效负载向下推一级,可以执行以下操作:
p:=*payload
*payload = Sieve {
prime: n,
prev: &p}
这将首先将payload
的内容分配给p
,然后将payload
内容重写为指向p
另一方面,如果要创建指向旧负载的新负载,请使用:
payload = Sieve {
prime: n,
prev: payload }
然后您必须返回/使用此新的有效负载
指针。使用下面的代码,您不是在创建筛
的新实例,而是将筛
的现有实例设置为指向自身:
*payload = Sieve{
prime: n,
prev: payload,
}
如果要将有效负载向下推一级,可以执行以下操作:
p:=*payload
*payload = Sieve {
prime: n,
prev: &p}
这将首先将payload
的内容分配给p
,然后将payload
内容重写为指向p
另一方面,如果要创建指向旧负载的新负载,请使用:
payload = Sieve {
prime: n,
prev: payload }
然后,您必须返回/使用此新的有效负载
指针。在覆盖有效负载所指向的筛选
结构之前,请复制它:
p := *payload
现在,您可以分配一个新的Sieve
struct值,将副本的地址存储为其prev
字段:
*payload = Sieve{
prime: n,
prev: &p,
}
通过此更改,您的应用程序将运行并正确输出介于2和10之间的素数(请在上尝试):
在覆盖有效负载所指向的筛
结构之前,请复制该结构:
p := *payload
现在,您可以分配一个新的Sieve
struct值,将副本的地址存储为其prev
字段:
*payload = Sieve{
prime: n,
prev: &p,
}
通过此更改,您的应用程序将运行并正确输出介于2和10之间的素数(请在上尝试):
非常感谢,非常感谢。