我正在评估Go取代Node.js基础架构,我不知道如何创建一个表示N-ary树的结构。
在JavaScript中,我解析文件以构建任意深度的地理位置的层次结构。这是一个例子:
{
'country1': {
'area1': {
'town1': {},
'town2': {}
},
'area2': {
'town3': {}
}
}
}
城镇可以扩展到特定的道路等等。层次结构没有固定的深度。
如何在Go中创建等效结构?
答案 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)