【问题标题】:Idiomatic way to store and iterate over a named nested data structure in Go?在 Go 中存储和迭代命名嵌套数据结构的惯用方式?
【发布时间】:2016-04-15 07:11:13
【问题描述】:

我的问题分为两部分:(1) 为下面的 taskList 存储数据的最佳方式是什么,以及 (2) 迭代这种结构的最佳方式是什么?

我想要命名 task1,因为它们是独特的任务,不应该有 ID 冲突。我想单独命名subtask0,因为它们是具有不同要求的独特任务。

下面是我的意图的伪 Go 表示:

package main

import "fmt"

fn main() {
    const taskList := {
        "task1": {
            "subtask0": "api.example.com/stuff/"
            "subtask1": "api.example.com/stuff/"
            "subtask2": "api.example.com/stuff/"
        }
        "task2": { 
            "subtask0": "api.example.com/stuff/"
            "subtask1": "api.example.com/stuff/"
            "subtask2": "api.example.com/stuff/"
        }
    }

    for i := range taskList {
        for j := range taskList[i] {
            fmt.Printf("%s\n", taskList[i][j])
        }
    }
}

我尝试过 struct,但在迭代 struct 时遇到了困难。我想避免使用 map,因为 Go 不允许我将其存储在 const 中。

【问题讨论】:

  • 你有多少子任务?需要您的子任务名称吗?
  • 假设一个固定但任意的数量,这意味着问题可能稍后有 10 个子任务,但一旦我定义它,我不希望数据结构增长或缩小。我希望为嵌套结构命名的原因是我不希望唯一 ID 之间发生冲突。
  • 但是你需要名字吗?喜欢task2subtask1?它们会在任何地方使用吗?
  • 我想要task1 的唯一原因是因为它们是独特的任务,不应该发生冲突。我想要subtask1 的原因是因为我会以不同的方式对待它们(某些 API 需要不同的标头),否则我会将它们放入数组中。
  • 在问题中添加这个怎么样?因为从您当前的“代码”中,没有人能猜到您想区别对待它们

标签: data-structures go iterator idioms


【解决方案1】:

根据我在您的伪代码中看到的内容以及我从 cmets 那里听到的内容,我会选择结构切片的切片:

所以我会定义一个结构:

type subtask struct {
    name string
    kind int
}

name 将是您的api.example.com/stuff/kind 将是您的子任务的一种类型:

我会以不同的方式对待它们(有些 API 需要不同的 标题)

那么您的列表将如下所示:

list := [][]subtask{
    []subtask{subtask{"example1", 1}, subtask{"example2", 1}},
    []subtask{subtask{"example3", 1}, subtask{"example4", 2}},
}

完整的工作示例在这里 Playground

【讨论】:

    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 2016-12-25
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多