为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的 N 叉树

Go 中的 N 叉树

Go
繁华开满天机 2021-11-08 16:59:41
我正在评估 Go 来替换 Node.js 基础设施,但我不确定如何创建一个结构来表示 N 元树。在 JavaScript 中,我解析一个文件以构建任意深度的地理位置层次结构。下面是一个例子:{  'country1': {    'area1': {      'town1': {},       'town2': {}    },    'area2': {      'town3': {}    }  }}城镇可以扩展为特定的道路等等。层次结构没有固定的深度。如何在 Go 中创建等效结构?
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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


type area struct {

    Name string

    //Any other area info

    Sections []*area

}

创建新的 struct 对象时不会初始化指针切片,因此它是一个有效的构造。声明a.Sections = new([]*area)并附加area指向它的指针。您将有len(a.Sections)一个for range用于树遍历的循环。


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


查看完整回答
反对 回复 2021-11-08
?
哔哔one

TA贡献1854条经验 获得超8个赞

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

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

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

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

在 Go 中,您可以将层次结构的每一层实现为 a 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 和 JSON的文章中提取的代码示例:


var parsed map[string]interface{}

data := []byte(`

    {

        "id": "k34rAT4",

        "age": 24

    }

`)

err := json.Unmarshal(data, &parsed)

idString := parsed["id"].(string)


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信