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之间的素数(请在上尝试):


非常感谢,非常感谢。