为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建新结构并将其原始值用作新结构的成员

如何创建新结构并将其原始值用作新结构的成员

Go
牧羊人nacy 2022-05-18 16:51:06
我正在尝试创建一个新结构并将其原始值用作新结构的成员。但是,它们最终都是相同的引用(即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,
        }


查看完整回答
反对 回复 2022-05-18
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

在覆盖Sieve指向的结构之前,payload复制它:


p := *payload

现在您可以分配一个新的Sieve结构值,将副本的地址存储为其prev字段:


*payload = Sieve{

    prime: n,

    prev:  &p,

}

通过此更改,您的应用程序将运行并正确输出 2 到 10 之间的素数(在Go Playground上尝试):


2

3

5

7


查看完整回答
反对 回复 2022-05-18
?
婷婷同学_

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指针。


查看完整回答
反对 回复 2022-05-18
  • 3 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信