猿问

Go 中的 N 叉树

我正在评估 Go 来替换 Node.js 基础设施,但我不确定如何创建一个结构来表示 N 元树。


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


{

  'country1': {

    'area1': {

      'town1': {}, 

      'town2': {}

    },

    'area2': {

      'town3': {}

    }

  }

}

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


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


繁华开满天机
浏览 256回答 2
2回答

30秒到达战场

如果您打算拥有任意深度,那么创建一个可以嵌套的默认结构可能是值得的:type area struct {    Name string    //Any other area info    Sections []*area}创建新的 struct 对象时不会初始化指针切片,因此它是一个有效的构造。声明a.Sections = new([]*area)并附加area指向它的指针。您将有len(a.Sections)一个for range用于树遍历的循环。解析和遍历将递归编码,因此如果您以不同的方式处理不同的区域,则需要一个类型标识符。

哔哔one

让我们回顾一下层次结构。在顶层,您将国家/地区名称映射到国家/地区对象。每个国家对象将区域名称映射到区域对象。每个区域对象将城镇名称映射到城镇对象。在 Go 中,您可以将层次结构的每一层实现为 a map[string]*Something,最后一层由Town包含有关城镇的各种信息的对象组成:type Country map[string]*Areatype Area map[string]*Towntype 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 和 JSON的文章中提取的代码示例:var parsed map[string]interface{}data := []byte(`    {        "id": "k34rAT4",        "age": 24    }`)err := json.Unmarshal(data, &parsed)idString := parsed["id"].(string)
随时随地看视频慕课网APP

相关分类

Go
我要回答