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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建新结构并将其原始值用作新结构的成员相关的知识,希望对你有一定的参考价值。

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

以上是关于如何创建新结构并将其原始值用作新结构的成员的主要内容,如果未能解决你的问题,请参考以下文章

测试原始网站与新网站

如何将sklearn Pipeline结构的结构和数据深度复制到新变量中?

PHP代码内存不足分配问题

如何在使用继承的类成员结构中添加新条目

如何使用结构将每个字符串中的字母移动到新字符串?

如何根据原始列表相同的值但不同的索引创建新列表