【问题标题】:How to create a new struct and use its original value as a member of the new struct如何创建新结构并将其原始值用作新结构的成员
【发布时间】:2020-03-04 20:46:10
【问题描述】:

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

【问题讨论】:

    标签: pointers go recursion struct


    【解决方案1】:

    您想更新“有效负载”指针以指向新结构的地址。像这样构建你的新结构:

    payload = &Sieve{
                prime: n,
                prev:  payload,
            }
    

    【讨论】:

      【解决方案2】:

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

      p := *payload
      

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

      *payload = Sieve{
          prime: n,
          prev:  &p,
      }
      

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

      2
      3
      5
      7
      

      【讨论】:

      • 非常感谢。
      【解决方案3】:

      使用下面的代码,您并没有创建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指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多