Go中的N-ary树

时间:2015-09-21 23:11:32

标签: go

我正在评估Go取代Node.js基础架构,我不知道如何创建一个表示N-ary树的结构。

在JavaScript中,我解析文件以构建任意深度的地理位置的层次结构。这是一个例子:

{
  'country1': {
    'area1': {
      'town1': {}, 
      'town2': {}
    },
    'area2': {
      'town3': {}
    }
  }
}

城镇可以扩展到特定的道路等等。层次结构没有固定的深度。

如何在Go中创建等效结构?

2 个答案:

答案 0 :(得分:3)

如果你有任意深度,那么创建一个可以嵌套的默认结构可能是值得的:

a.Sections = new([]*area)

创建新的struct对象时,不会初始化一些指针,因此它是一个有效的构造。声明area并附加len(a.Sections)指针。您将在树遍历中使用for range或{{1}}循环。

解析和遍历将以递归方式编码,因此如果您以不同方式处理不同区域,则需要类型标识符。

答案 1 :(得分:2)

让我们回顾一下层次结构。

  • 在顶层,您可以将国家/地区名称映射到国家/地区对象。

  • 每个国家/地区对象都将区域名称映射到区域对象。

  • 每个区域对象都将城镇名称映射到城镇对象。

在Go中,您可以将层次结构的每个级别实现为map[string]*Something,最后一级包含Town个对象,其中包含有关城镇的各种信息:

type Country map[string]*Area

type Area map[string]*Town

type Town struct {
    Name                string
    Population          int
    Latitude, Longitude float64
}

您在问题中提供的示例层次结构将如下所示:

countries := map[string]*Country{
    "country1": &Country{
        "area1": &Area{
            "town1": &Town{},
            "town2": &Town{},
        },
        "area2": &Area{
            "town3": &Town{},
        },
    },
}

如果您不想映射到具体类型,可以使用map[string]interface{},但是您需要使用类型断言来处理这些值。以下是从Zack Bloom关于Go and JSON的文章中获取的代码示例:

var parsed map[string]interface{}
data := []byte(`
    {
        "id": "k34rAT4",
        "age": 24
    }
`)
err := json.Unmarshal(data, &parsed)
idString := parsed["id"].(string)