我想实现一个图形数据结构,其中每个节点都由以下内容表示:
type Node struct {
root string
links []*Node
}
基本上每个节点都有一个值root
和一个链接列表,对于每个链接,只想存储指向它的指针,因为该结构的内存将由映射分配和拥有:>
rooturl := "root"
graph := Node{rooturl, []*Node{}}
graphMap := make(map[string]Node)
graphMap[rooturl] = graph
当我尝试将指针添加到新创建的Node时出现问题:
u := "new node"
// if the link is not stored in the graph not create a new node
if _, exists := graphMap[u]; !exists {
graphMap[u] = Node{u, []*Node{}}
}
// add the links to the graph
graphMap[rooturl].links = append(graphMap[rooturl].links, &graphMap[u])
我遇到两个错误:
无法分配给结构字段graphMap [rooturl]。地图中的链接
和
无法获取graphMap [u]
的地址
我应该如何正确解决此问题?
我还希望在追加时需要使用graphMap[rooturl].links
两次查询地图(但是由于我无法获取指针或对它的引用,所以我不知道怎么做)
答案 0 :(得分:1)
您无法实现的目标。关于可寻址性和可分配性。您应该搜索此规范的语言规范。映射值不可寻址,因此该值中的struct字段不可分配。另外,至少对我来说,您的数据结构设计看起来效率不是很高。
在我看来,没有理由在地图中存储值,引用就足够了
type Node struct {
root string
links []*Node
}
//////
rooturl := "root"
graph := Node{rooturl, []*Node{}}
graphMap := make(map[string]*Node)
graphMap[rooturl] = &graph
u := "new node"
// if the link is not stored in the graph not create a new node
if _, exists := graphMap[u]; !exists {
graphMap[u] = &Node{u, []*Node{}}
}
// add the links to the graph
graphMap[rooturl].links = append(graphMap[rooturl].links, graphMap[u])
如果您仍然希望在地图中保留实际值,则根本不需要树结构。看起来像不需要的开销。存储在地图中的信息足以进行任何操作。
type Node string
type Graph map[Node][]Node
////
rooturl := Node("root")
graph := make(Graph)
graph[rooturl] = make([]Node, 0)
u := Node("new node")
// if the link is not stored in the graph not create a new node
if node, exists := graph[u]; !exists {
graph[u] = make([]Node, 0)
graph[rooturl] = append(graph[rooturl], u)
}
答案 1 :(得分:0)
由于go是一种垃圾收集语言,因此您实际上不需要“拥有”节点内存的映射概念。您可能只是将指针存储在地图中。