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

我正在尝试创建一个新结构并将其原始值用作新结构的成员。但是,它们最终都是相同的引用(即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)

    }

}


牧羊人nacy
浏览 122回答 3
3回答

守着一只汪

您想更新“有效负载”指针以指向新结构的地址。像这样构造你的新结构:payload&nbsp;=&nbsp;&Sieve{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prime:&nbsp;n, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev:&nbsp;&nbsp;payload, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

开心每一天1111

在覆盖Sieve指向的结构之前,payload复制它:p := *payload现在您可以分配一个新的Sieve结构值,将副本的地址存储为其prev字段:*payload = Sieve{&nbsp; &nbsp; prime: n,&nbsp; &nbsp; prev:&nbsp; &p,}通过此更改,您的应用程序将运行并正确输出 2 到 10 之间的素数(在Go Playground上尝试):2357

婷婷同学_

使用下面的代码,您不是在创建 的新实例Sieve,而是将现有的实例设置Sieve为指向自身:*payload = Sieve{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prime: n,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prev:&nbsp; payload,&nbsp; &nbsp; &nbsp; &nbsp; }如果你想把payload一层往下推,你可以这样做:p:=*payload*payload = Sieve {&nbsp; prime: n,&nbsp; prev: &p}这将首先分配payloadto的内容p,然后将payload内容重写为指向p。另一方面,如果你想创建一个新的payload指向旧的,使用:payload = Sieve {&nbsp;&nbsp; &nbsp;prime: n,&nbsp; &nbsp;prev: payload }然后你必须返回/使用这个新payload指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go