登录
首页 >  Golang >  Go问答

在Go中使用递归和迭代处理结构体数组

来源:stackoverflow

时间:2024-02-14 19:54:22 164浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《在Go中使用递归和迭代处理结构体数组》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我需要迭代 json 文件中的所有答案选项:

{"questions": [
  {"id": 1,
    "question": "what is your marital status?",
      "answer":[ {
        "text": "single",
        "next_question": 2
      },
        {
        "text": "married",
        "next_question": 3
      }]
    },
  {"id":2,
    "question": "are you planning on getting married next year?",
    "answer":[{
      "text": "yes",
      "next_question": 3
      },
      {
      "text": "no",
      "next_question": 5
    }]},
  {"id":3,
    "question": "how long have you been married?",
    "answer": [{
      "text": "less than a year",
      "next_question": 6
    },
    {
      "text": "more than a year",
      "next_question": 4
    }]},
  {"id":4,
    "question":"have you celebrated your one year anniversary?",
    "answer": [{
      "text": "yes",
      "next_question": 7
    },
     {
      "text": "no",
      "next_question": 8
    }]}
]}

并写下路径和编号,例如:

{"paths": {"number": 3, "list": [
  [{"what is your marital status?": "single"},
    {"are you planning on getting married next year?": "yes/no"}],
  [{"what is your marital status?": "married"},
    {"how long have you been married?": "less than a year"}],
  [{"what is your marital status?": "married"},
    {"how long have you been married?": "more than a year"},
    {"have you celebrated your one year anniversary?": "yes/no"}]
]}}

您可以根据需要更改 json 结构,但主要是显示有关所有可能的轮询路径数量 (paths.number) 的信息,以及通过一系列问题和答案显示所有可能的路径 (paths.list)

因此,我将 json 解析为以下结构:

type (
   answer struct {
      text         string `json:"text"`
      nextquestion int    `json:"next_question"`
   }
   question struct {
      id       int      `json:"id"`
      question string   `json:"question"`
      answer   []answer `json:"answer"`
   }
   input struct {
      questions []question `json:"questions"`
   }
)

并尝试迭代:

func (input Input) Script(itterQuestion []Question, element Question) []Question {
   itterQuestion = append(itterQuestion, element)
   for i, item := range input.Questions {
      if item.Id != itterQuestion[i].Id {
         itterQuestion = append(itterQuestion, item)
        
      } else {
         return input.Script(itterQuestion, item)
      }
   }
   return itterQuestion
}

但是我不明白如何正确编写json的递归函数和输出结构。


正确答案


既然你想创建多个路径,那么就必须有[][]question。 此外,您还必须附加递归函数的结果,而不是仅仅返回。

这是工作示例:

func (input Input) Script (id int) (out [][]Question) {
    for _, q := range input.Questions {
        if q.Id == id {
            added := false // avoid add last multiple times
            for _, answer := range q.Answer {
                paths := input.Script(answer.NextQuestion)
                if len(paths) == 0  && !added {
                    // answer has no next question | question not found in input
                    out = append(out, []Question{q})
                    added = true
                }
                for _, path := range paths {
                    // prepend question to every path from recursive function
                    path = append([]Question{q}, path...)
                    out = append(out, path)
                }
            }

            return out
        }
    }
    return out
}

理论要掌握,实操不能落!以上关于《在Go中使用递归和迭代处理结构体数组》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>